Kubernetes 是 Goole 开源的一个容器编排引擎, 它支持自动化部署, 大规模可伸缩, 应用容器化管理 -- 百度百科.
接触 K8s 也有半年多了, 也基于阿里云平台搭建了包含多级服务, 目前运行较为稳定的 K8s 集群(感兴趣的可参考 k8s 云集群混搭模式, 可能帮你节省 50% 以上的服务成本 https://mp.weixin.qq.com/s/8s-OUUsZI0UyyyTgruEO1A , k8s 云集群混搭模式落地分享 https://mp.weixin.qq.com/s/VuSWn7cWacW6i_MtpvQ5Sw ), 但一直没来得及对其进行系统的学习, 本系列文章还像以前 Docker 系列一样, 以笔记的形式进行记录与分享, 会包括理论与实践, 感兴趣的同学可以关注, 一起探索下目前较为流行的容器化及服务编排解决方案.
工欲善其事, 必先利其器, 本文先介绍如何在本地自行搭建一套 k8s 集群, 并且采用我们前面介绍过的 Ansible 来提高效率(参考 Ansible 简明教程 https://mp.weixin.qq.com/s/JIZE1RvN7Yop5dsOHJvStw )
本文所涉及的所有配置文件可在这里找到
一. 准备服务器节点
如果还没有服务器, 可以参考 ubuntu18.04 上搭建 KVM 虚拟机环境超完整过程 https://mp.weixin.qq.com/s/FVyzPVwwQ85AC4jlVZvF4g 创建虚拟服务器.
服务器节点 IP(hostname):
- 192.168.40.111 (kmaster)
- 192.168.40.112 (knode1)
- 192.168.40.113 (knode2)
- 192.168.40.114 (knode3)
操作系统版本:
- cat /etc/RedHat-release
- : CentOS Linux release 7.6.1810 (Core)
- uname -a : 3.10.0-957.el7.x86_64
二. 配置 Ansible
如果还没有 Ansible 环境, 可以参考 [Ansible 简明教程] https://mp.weixin.qq.com/s/JIZE1RvN7Yop5dsOHJvStw ) 搭建.
1. 在 Ansible 服务器上的 / etc/hosts 文件中添加 k8s 服务器节点信息(参考 )
- 192.168.40.111 kmaster
- 192.168.40.112 knode1
- 192.168.40.113 knode2
- 192.168.40.114 knode3
2. 在 Ansible 服务器上的 / etc/ansible/hosts 文件中添加 k8s 服务器节点(参考 )
- [k8s-all]
- kmaster
- knode1
- knode2
- knode3
- [k8s-master]
- kmaster
- [k8s-nodes]
- knode1
- knode2
- knode3
三. 修改 k8s 集群各节点 / etc/hosts(非必须)
修改所有主机 / etc/hosts 文件, 添加 IP / 主机名映射, 方便通过主机名 SSH 访问
1. 创建 playbook 文件(参考 )
VIM set_hosts_playbook.YAML
- ---
- - hosts: k8s-all
- remote_user: root
- tasks:
- - name: backup /etc/hosts
- shell: mv /etc/hosts /etc/hosts_bak
- - name: copy local hosts file to remote
- copy: src=/etc/hosts dest=/etc/ owner=root group=root mode=0644
2. 执行 ansible-playbook
ansible-playbook set_hosts_playbook.YAML
四. 安装 Docker
在所有主机上安装 Docker
1. 创建 playbook 文件(参考 )
VIM install_docker_playbook.YAML
- - hosts: k8s-all
- remote_user: root
- vars:
- docker_version: 18.09.2
- tasks:
- - name: install dependencies
- #shell: yum install -y yum-utils device-mapper-persistent-data lvm2
- yum: name={{item}} state=present
- with_items:
- - yum-utils
- - device-mapper-persistent-data
- - lvm2
- - name: config yum repo
- shell: yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
- - name: install docker
- yum: name=docker-ce-{{docker_version}} state=present
- - name: start docker
- shell: systemctl enable docker && systemctl start docker
2. 执行 ansible-playbook
ansible-playbook install_docker_playbook.YAML
五. 部署 k8s master
1. 开始部署之前, 需要做一些初始化处理: 关闭防火墙, 关闭 selinux, 禁用 swap, 配置 k8s 阿里云 yum 源等, 所有操作放在脚本 中, 并在 2 中 playbook 中通过 script 模块执行
2. 创建 playbook 文件 , 只针对 master 节点, 安装 kubectl,kubeadm,kubelet, 以及 flannel(将 kube-flannel.YAML 文件里镜像地址的 quay.io 改为 quay-mirror.qiniu.com 避免超时, 参考 )
VIM deploy_master_playbook.YAML
- - hosts: k8s-master
- remote_user: root:q
- vars:
- kube_version: 1.16.0-0
- k8s_version: v1.16.0
- k8s_master: 192.168.40.111
- tasks:
- - name: prepare env
- script: ./pre-setup.sh
- - name: install kubectl,kubeadm,kubelet
- yum: name={{item}} state=present
- with_items:
- - kubectl-{{kube_version}}
- - kubeadm-{{kube_version}}
- - kubelet-{{kube_version}}
- - name: init k8s
- shell: kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version {{k8s_version}} --apiserver-advertise-address {{k8s_master}} --pod-network-cidr=10.244.0.0/16 --token-ttl 0
- - name: config kube
- shell: mkdir -p $HOME/.kube && cp -i /etc/kubernetes/admin.conf $HOME/.kube/config && chown $(id -u):$(id -g) $HOME/.kube/config
- - name: copy flannel YAML file
- copy: src=./kube-flannel.YAML dest=/tmp/ owner=root group=root mode=0644
- - name: install flannel
- shell: kubectl apply -f /tmp/kube-flannel.YAML
- - name: get join command
- shell: kubeadm token create --print-join-command
- register: join_command
- - name: show join command
- debug: var=join_command verbosity=0
3. 执行 ansible-playbook
ansible-playbook deploy_master_playbook.YAML
4. 上述命令执行完成会输出节点加入 k8s 集群的命令, 如下图. 记下该命令, 后面部署 node 时会用到
六. 部署 k8s node
1. 同 master 一样, 开始部署之前, 需要做一些初始化处理: 关闭防火墙, 关闭 selinux, 禁用 swap, 配置 k8s 阿里云 yum 源等, 所有操作放在脚本 中, 并在 2 中 playbook 中通过 script 模块执行
2. 创建 playbook 文件 , 针对除 master 外的其它集群节点, 安装 kubeadm,kubelet, 并将节点加入到 k8s 集群中, 使用的是前面部署 master 时输出的加入集群命令
VIM deploy_nodes_playbook.YAML
- - hosts: k8s-nodes
- remote_user: root
- vars:
- kube_version: 1.16.0-0
- tasks:
- - name: prepare env
- script: ./pre-setup.sh
- - name: install kubeadm,kubelet
- yum: name={{item}} state=present
- with_items:
- - kubeadm-{{kube_version}}
- - kubelet-{{kube_version}}
- - name: start kubelt
- shell: systemctl enable kubelet && systemctl start kubelet
- - name: join cluster
- shell: kubeadm join 192.168.40.111:6443 --token zgx3ov.zlq3jh12atw1zh8r --discovery-token-ca-cert-hash sha256:60b7c62687974ec5803e0b69cfc7ccc2c4a8236e59c8e8b8a67f726358863fa7
3. 执行 ansible-playbook
ansible-playbook deploy_nodes_playbook.YAML
4. 稍等片刻, 即可在 master 节点上通过 kubectl get nodes 看到加入到集群中的节点, 并且 status 为 Ready 状态, 如下
- [root@kmaster ~]# kubectl get nodes
- NAME STATUS ROLES AGE VERSION
- kmaster Ready master 37m v1.16.0
- knode1 Ready <none> 7m1s v1.16.0
- knode2 Ready <none> 7m1s v1.16.0
- knode3 Ready <none> 4m12s v1.16.0
至此, k8s 集群基本部署完成. 接下来可安装 Ingress 与 Dashboard.
七. 安装 Ingress
Ingress 为集群内服务提供外网访问, 包括基于 Nginx 与 Traefik 两个版本, 这里使用比较熟悉的 Nginx 版本. 安装 Ingress 的操作在 master 节点进行(因为前面在 master 节点安装并配置了 kubectl, 也可在其它安装并配置好了 kubectl 的节点进行)
1. 下载 YAML 文件(此目录已包含 , 并修改了镜像地址, 可直接进入第 3 步)
wget -O nginx-ingress.YAML https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/deploy.yaml
2. 将里面的 quay.io 修改为 quay-mirror.qiniu.com, 避免镜像拉取超时. 同时在 nginx-ingress-controller 的 Deployment 上添加 hostNetwork 为 true 及 nginx-ingress 的标签, 以使用宿主机网络与控制 Ingress 部署的节点
- VIM nginx-ingress.YAML
- :s/quay.io/quay-mirror.qiniu.com/g
- VIM nginx-ingress.YAML
- spec:
- hostNetwork: true
- nodeSelector:
- nginx-ingress: "true"
3. 部署 Ingress
首先在 knode1 节点上打标签 nginx-ingress=true, 控制 Ingress 部署到 knode1 上, 保持 IP 固定.
- [root@kmaster k8s-deploy]# kubectl label node knode1 nginx-ingress=true
- node/knode1 labeled
然后完成 nginx-ingress 的部署
kubectl apply -f nginx-ingress.YAML
4. 部署完成, 稍等片刻等 Pod 创建完成, 可通过如下命令查看 ingress 相关 Pod 情况
- [root@kmaster k8s-deploy]# kubectl get pods -n ingress-nginx -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- ingress-nginx-admission-create-drpg5 0/1 Completed 0 79m 10.244.2.2 knode1 <none> <none>
- ingress-nginx-admission-patch-db2rt 0/1 Completed 1 79m 10.244.3.2 knode3 <none> <none>
- ingress-nginx-controller-575cffb49c-4xm55 1/1 Running 0 79m 192.168.40.112 knode1 <none> <none>
八. 安装 Kubernetes Dashboard
1. 下载 YAML 文件(此目录已包含 文件, 可直接进入第 3 步)
wget -O kubernetes-dashboard.YAML https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta5/aio/deploy/recommended.yaml
2. 修改 kubernetes-dashboard.YAML
将 Service type 改为 NodePort, 使得可通过 IP 访问 Dashboard. 注释掉默认的 Secret(默认的 secret 权限很有限, 看不到多少数据)
- kind: Service
- apiVersion: v1
- metadata:
- labels:
- k8s-App: kubernetes-dashboard
- name: kubernetes-dashboard
- namespace: kubernetes-dashboard
- spec:
- type: NodePort
- ports:
- - port: 443
- targetPort: 8443
- nodePort: 30443
- selector:
- k8s-App: kubernetes-dashboard
3. 部署 Dashboard, 并创建绑定 cluster-admin 角色的 ServiceAccount -- admin-user (参考 )
- kubectl apply -f kubernetes-dashboard.YAML
- kubectl apply -f kubernetes-dashboard-auth.YAML
4. 访问 Dashboard
访问 https:// 集群任意节点 IP:30443 https://xn--ip-dh3cr99d42rvou4sez72c:30443/ , 打开 Dashboard 登录页面, 执行如下命令获取登录 token
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
使用 token 完成登录, 如图
九. 解决证书无效问题
安装完后, 默认的证书可能无效, 在 Chrome 浏览中无法打开 Dashboard, 可通过重新生成证书解决.
1. 创建自定义证书
- [root@kmaster ~]# cd /etc/kubernetes/pki/
- # 生成私钥
- [root@kmaster pki]# openssl genrsa -out dashboard.key 2048
- # 生成证书
- [root@kmaster pki]# openssl req -new -key dashboard.key -out dashboard.csr -subj "/O=JBST/CN=kubernetes-dashboard"
- # 使用集群的 CA 来签署证书
- [root@kmaster pki]# openssl x509 -req -in dashboard.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out dashboard.crt -days 3650
- # 查看自创证书
- [root@kmaster pki]# openssl x509 -in dashboard.crt -noout -text
2. 注释 中默认的 Secret,
- #---
- #
- #apiVersion: v1
- #kind: Secret
- #metadata:
- # labels:
- # k8s-App: kubernetes-dashboard
- # name: kubernetes-dashboard-certs
- # namespace: kubernetes-dashboard
- #type: Opaque
3. 重新部署 Dashboard, 并通过自定义证书创建新的 Secret
- [root@kmaster k8s-deploy]# kubectl delete -f kubernetes-dashboard.YAML
- [root@kmaster k8s-deploy]# kubectl apply -f kubernetes-dashboard.YAML
- [root@kmaster k8s-deploy]# kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.crt=/etc/kubernetes/pki/dashboard.crt --from-file=dashboard.key=/etc/kubernetes/pki/dashboard.key -n kubernetes-dashboard
十. 在本地 (win10) 管理 k8s 集群
1. 下载 kubectl Windows 版本:
2. 将 kubectl.exe 文件所在目录加入系统环境变量的 Path 中
3. 将 master 节点上 /etc/kubernetes/admin.conf 的内容拷贝到本地用户目录的 .kube/config 文件中, 如 C:\Users\Administrator\.kube\config
4. 验证
- C:\Users\Administrator>kubectl get nodes
- NAME STATUS ROLES AGE VERSION
- kmaster Ready master 4d19h v1.16.0
- knode1 Ready <none> 4d19h v1.16.0
- knode2 Ready <none> 4d19h v1.16.0
- knode3 Ready <none> 4d19h v1.16.0
本文所涉及的所有配置文件可在这里找到
来源: https://www.cnblogs.com/spec-dog/p/12793018.html