一、K8S集群基本概念

基础网络安全——K8S关键概念及搭建过程中遇到的问题补充_k8s

              k8s是一组服务器集群,是一个分布式的容器编排系统,对运行在集群上的容器进行管理,K8S集群包括控制平面(Control Plane)以及1个或者多个工作节点(worker node),而控制平面包括master node以及etcd节点。并且在这两种类型的节点上运行多种不同的服务,如上图所示。

     (一)相关组件

       1、控制平台:

master节点运行的组件:

              kube-apiserver:暴露K8S HTTP API服务,接受客户端操作k8s的指令

              kube-schduler:从多个worker node节点中选举一个节点来启动服务

              kube-controller-manager:运行controller服务,并向K8S集群API发送指令

              cloud-controller manager:这是一个可选的服务,用于提供向云服务商的连接

              etcd服务:

              k8s的数据库,提供一致性以及高可用的键值存储服务,用来注册节点、服务、记录账户

      2、work节点的组件:

              kubelet:向docker发送指令管理docker容器的

              kubeproxy:管理docker容器的网络,如分配IP,暴露端口等

              Container runtime:提升容器的运行时环境。

       除了上述两个主要主件之外,还包括一系列的插件,如DNS、WebUI等。

      (二)主要概念

Pod:pod是k8s最小部署单元,K8S不能直接启动docker,一个pod中可以有一个或者多个容器,或者一组容器,它们共享存储及网络资源,以及如何运行这些容器的说明。

       Controllers:这是比Pod更加高抽象层级的工作负载对象,在K8S的控制平台完成对容器的自动化控制,如pod的启动、停止、删除等,包括多个控制器,如ReplicaSet、Deployment、StatefulSet、DaemonSet、Job、Cronjob。

       service:service用于将一组pod关联起来,提供一个统一的访问入口,即使pod地址发生改变,这个统一入口也不会变化,可以保证用户访问不受影响

       label:标签,一组pod是一个统一的标签,service是通过标签和一组pod进行关联的

       namespace:名称空间,在K8S中用来隔离一组资源的机制,K8S初始情况下有4个namespace,分别是default、kube-node-lease、kube-public、kube-system。用于在多个团队、项目使用的环境中进行资源隔离。

二、环境部署中遇到的问题

问题:kubectl get pods -n kube-system 始终显示在init状态:

1、 查看worker节点kubelet日志:

tail -f /opt/kubernetes/logs/kubelet.INFO

E0818 13:27:53.180431   21851 remote_runtime.go:105] RunPodSandbox from runtime service failed: rpc error: code = Unknown desc = failed pulling image "lizhenliang/pause-amd64:3.0": error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/99/99e59f495ffaa222bfeb67580213e8c28c1e885f1d245ab2bbe3b1b1ec3bd0b2/data?verify=1723961848-ZrNEQWYbkJA19yEi7AsbB3qFiEs%3D: dial tcp 108.160.165.53:443: i/o timeout

E0818 13:27:53.180462   21851 kuberuntime_sandbox.go:68] CreatePodSandbox for pod "kube-flannel-ds-amd64-gspjg_kube-system(80f419cd-27c1-460a-8d32-964801feb605)" failed: rpc error: code = Unknown desc = failed pulling image "lizhenliang/pause-amd64:3.0": error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/99/99e59f495ffaa222bfeb67580213e8c28c1e885f1d245ab2bbe3b1b1ec3bd0b2/data?verify=1723961848-ZrNEQWYbkJA19yEi7AsbB3qFiEs%3D: dial tcp 108.160.165.53:443: i/o timeout

基础网络安全——K8S关键概念及搭建过程中遇到的问题补充_flannel_02

经排查,在kubelet.conf的配置文件中配置了一个参数:

--pod-infra-container-image=lizhenliang/pause-amd64:3.0"

该参数指定了基础镜像,所以会一直从这里拉取镜像,当镜像不可访问时即会失败。修改为:--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"

2、 在master节点修改kube-flannel.yml文件中镜像拉取的地址:

image: registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64,有两处需要修改,如下:

基础网络安全——K8S关键概念及搭建过程中遇到的问题补充_kubenetes_03

三、扩容和更新

根据线上需求,扩容和缩容是常会遇到的问题。Scaling 是通过更改 Deployment 中的副本数量实现的。一旦您有应用程序的多个实例,您将能够滚动更新,而不会停止服务。通过 kubectl scale 指令来扩容和缩容:

kubectl get pods -L app --show-labels

# 输出如下

NAME                         READY   STATUS    RESTARTS   AGE     APP          LABELS

hello-node-66f488898-mbwmm   1/1     Running   2          3h22m   hello-node   app=hello-node,pod-template-hash=66f488898

# 调查可知,扩充pods数一般就扩充

kubectl scale --replicas=2 deployment/hello-node

再查看当前pods:

NAME                         READY   STATUS    RESTARTS   AGE

hello-node-66f488898-22nrh   1/1     Running   0          68s

hello-node-66f488898-mbwmm   1/1     Running   2          3h43m

四、容器网络补充

(一)docker网络补充

系统上运行docker时,docker容器与主机之间的网络关系如下:

基础网络安全——K8S关键概念及搭建过程中遇到的问题补充_基础安全_04

1、 在主机上启动docker服务时,主机上会生成docker0虚拟网卡,该网卡为桥接模式,并且docker将在私有网段中随机分配一个地址给docker0,后续启动容器时,容器内的网卡也将分配该网段的IP地址。

基础网络安全——K8S关键概念及搭建过程中遇到的问题补充_flannel_05

2、 新建docker容器时,自动创建veth pair接口对,分别为eth0及vethXX,其中eth0在容器内,vethXX连接到docker0上。

基础网络安全——K8S关键概念及搭建过程中遇到的问题补充_k8s_06

(二)K8S flannel网络补充

1、 部署K8S后,通过部署网络插件实现网络的互联互通,主流的插件有flannel,calico等,默认支持flannel插件,部署插件后,可以看到多了cni0网卡,该网卡同样为桥接模式:

基础网络安全——K8S关键概念及搭建过程中遇到的问题补充_flannel_07

2、 此时就会有docker0以及cni0两张虚拟网卡,cni0将替换docker0,容器的vethXX接口将会桥接到cni0上面:

基础网络安全——K8S关键概念及搭建过程中遇到的问题补充_k8s_08

3、 进入到容器里面查看IP地址,容器的IP和cni0在同一个网段:

基础网络安全——K8S关键概念及搭建过程中遇到的问题补充_kubenetes_09

五、其他命令补充:

1、创建命名空间:

[root@k8s-master1 ~]# kubectl create ns test

namespace/test created

2、在指定命名空间中创建pod:

[root@k8s-master1 ~]# kubectl create deploy nginxdemo2 --image=nginx:1.8 -n test

deployment.apps/nginxdemo2 created

3、在master上进入pod:

[root@k8s-master1 ~]# kubectl exec -it nginxdemo2-54fb4895fc-dm29k -n test /bin/bash

root@nginxdemo2-54fb4895fc-dm29k:/#

进入pod实际上就是进入了容器,和在worker上通过docker exec –it 是一样的。