一、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
经排查,在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,有两处需要修改,如下:
三、扩容和更新
根据线上需求,扩容和缩容是常会遇到的问题。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容器与主机之间的网络关系如下:
1、 在主机上启动docker服务时,主机上会生成docker0虚拟网卡,该网卡为桥接模式,并且docker将在私有网段中随机分配一个地址给docker0,后续启动容器时,容器内的网卡也将分配该网段的IP地址。
2、 新建docker容器时,自动创建veth pair接口对,分别为eth0及vethXX,其中eth0在容器内,vethXX连接到docker0上。
(二)K8S flannel网络补充
1、 部署K8S后,通过部署网络插件实现网络的互联互通,主流的插件有flannel,calico等,默认支持flannel插件,部署插件后,可以看到多了cni0网卡,该网卡同样为桥接模式:
2、 此时就会有docker0以及cni0两张虚拟网卡,cni0将替换docker0,容器的vethXX接口将会桥接到cni0上面:
3、 进入到容器里面查看IP地址,容器的IP和cni0在同一个网段:
五、其他命令补充:
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 是一样的。
标签:网络安全,容器,kube,node,docker,K8S,pod,搭建 From: https://blog.51cto.com/u_9652359/11930670