简介
Kubernetes
由Google
在2014
年6
月开源的一个容器集群部署与管理系统,简称为K8S
。Kubernetes
由Google
内部的Borg
容器集群部署和管理系统衍生而来,使用Go
语言开发。Kubernetes
是一个可以移植、可扩展的开源平台,使用声明式的配置
并依据配置信息自动地执行容器化应用程序的管理。Kubernetes
主要用于自动化部署、扩展和管理容器应用,提供资源的调度、部署管理、服务发现、扩容缩容、运维监控等一整套功能。
介绍集群
文档
GitHub
:《传送门》。- 版本策略:《传送门》
- 单主集群:《传送门》
- 升级集群:《传送门》
版本
OS
:CentOS 7.7
Etcd
:3.4.3
Flannel
:0.12.0
CoreDNS
:1.6.5
Docker
:19.03.8
Kubernetes
:1.17.4
要求
- 每个节点的操作系统版本为
CentOS 7.7
。 - 每个节点至少拥有
2
个CPU
、2G
的RAM
。 - 每个节点的主机名都是唯一的,并且不包含下划线、小数点、大写字母。
- 每个节点都有固定的
IP
地址,并且节点之间能相互通信。 - 每个节点都关闭了
swap
分区,此要求从K8S v1.8
开始实施。 - 每个
Master
节点需安装docker
、kubeadm
、kubectl
、kubelet
。 - 每个
Node
节点需安装docker
、kubeadm
、kubelet
。
规划
IP | 角色 | 组件 |
---|---|---|
172.18.20.10 | Master | etcd、flannel、kube-apiserver、kube-controller-manager、kube-scheduler |
172.18.20.11 | Node | flannel、kube-proxy、kubelet |
172.18.20.12 | Node | flannel、kube-proxy、kubelet |
部署集群
SetUP
- 更换国内软件源: 《CentOS/Ubuntu的国内软件源》。
1 | # 关闭SELinux |
Docker
请参考《Linux上安装Docker》完成
Docker
的安装。配置守护进程:
1 | mkdir -p /etc/docker |
1 | { |
1 | systemctl enable docker.service |
Kubernetes
Package
1 | vim /etc/yum.repos.d/kubernetes.repo |
1 | [kubernetes] |
1 | # 更新软件源 |
Master
- 初始化集群:
1 | kubeadm init \ |
- 拷贝配置文件:
1 | mkdir -p /root/.kube |
- 获取节点信息,
Master
节点状态为NotReady
:
1 | kubectl get nodes |
- 因为没有为集群部署容器网络接口
CNI
,所以节点状态是NotReady
,基于Pod
的网络插件:Calico
、Flannel
等。
Flannel
- 下载配置文件:
1 | # GitHub: https://github.com/coreos/flannel/releases/ |
- 修改配置文件:
1 | vim kube-flannel.yml |
1 | # 将 net-conf.json 中的 Network 修改为 kubeadm init 时的 pod-network-cidr |
- 部署
Flannel
:
1 | kubectl apply -f kube-flannel.yml |
- 获取节点信息,
Master
节点状态为Ready
:
1 | kubectl get nodes |

- 为解决
Cluster IP
访问速度慢的问题,需要在所有节点添加Service
网段的路由:
1 | ip route add 10.10.0.0/16 dev flannel.1 |
Node
- 由于令牌(
Token
)有效期为24
小时,若过了有效期,还需添加Node
节点,则需要重新创建令牌。 - 将自身加入到集群中:
1 | kubeadm join 172.18.20.10:6443 \ |
Master
- 给节点设置
Lable
:
1 | kubectl label nodes node-1 node-role.kubernetes.io/node= |
- 获取节点信息,总共有
3
个节点,节点状态都为Ready
:
1 | kubectl get nodes |

Dashboard
在
Master
节点上为集群部署Dashboard
。下载配置文件:
1 | # https://github.com/kubernetes/dashboard |
- 修改配置文件:
1 | vim recommended.yaml |
1 | apiVersion: v1 |
- 部署
Dashboard
:
1 | kubectl apply -f recommended.yaml |
- 创建证书并导入:
1 | openssl genrsa -out dashboard.key 2048 |
- 查看服务状态:
1 | kubectl get pods -n kubernetes-dashboard |
- 创建
Server Account
并绑定默认的cluster-admin
角色:
1 | kubectl create serviceaccount dashboard-admin -n kube-system |
- 服务状态都为
Running
,通过https://<Node IP>:31443
进行访问,输入创建的Token
进行登录。
测试集群
- 部署一个
Nginx
的Deployment
:
1 | # https://kubernetes.io/docs/concepts/workloads/controllers/deployment/ |
- 获取服务状态:
1 | kubectl get all |
- 以
NodePort
方式对外提供服务:
1 | # https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/ |
- 获取访问端口及所在的
Node
:
1 | kubectl get svc,pods -o wide |

- 观察到应用落到了
node-1
上,外部访问端口是30651
。
1 | # 访问 Cluster IP |
- 查看指定容器的日志:
1 | kubectl logs nginx-745b4df97d-wkkqk |
- 故障排查,分析创建流程:
1 | kubectl describe deployment nginx |
- 更新镜像:
1 | # 方式一 |
- 回滚操作:
1 | # 查看操作的历史 |
- 集群扩容:
1 | kubectl scale --replicas=3 deployment/nginx |
- 缩容服务:
1 | kubectl scale --replicas=2 deployment/nginx |
- 删除服务:
1 | kubectl delete deployment/nginx |
维护集群
常用命令
- 获取令牌(
Token
)列表:
1 | kubeadm token list |
- 创建令牌(
Token
):
1 | kubeadm token create |
- 获取指定
namespaces
的pods
:
1 | kubectl get pods -n kube-system |
- 获取所有的
Service
:
1 | kubectl get service --all-namespaces |
- 获取所有的
Deployment
:
1 | kubectl get deployment --all-namespaces |
卸载集群
Dashboard
- 卸载
Dsahboard
:
1 | kubectl delete -f recommended.yaml |
Node
- 在
Master
节点上删除Node
,并确保此Node
为空, 然后再将其关闭。
1 | kubectl drain <Node Name> --delete-local-data --force --ignore-daemonsets |
- 在对应的
Node
节点上重置节点:
1 | kubeadm reset |
Master
- 在
Master
节点上删除自身,并确保没有其他Node
节点。
1 | kubectl drain <Master Name> --delete-local-data --force --ignore-daemonsets |
- 在
Master
节点上重置节点:
1 | kubeadm reset |