通过本系列文章,你将能够使用Kubeadm和Binary方式部署高可用的Kubernetes集群,了解集群中的一些名词及概念,在集群上部署容器化应用程序,并调试、扩容、更新、对外发布这些程序,实现流量治理,轻松搞定蓝绿发布、AB测试、金丝雀发布等集群相关功能。
Kubernetes协调高度可用的计算机集群,这些计算机作为一个单元连接在一起工作。Kubernetes允许将容器化的应用程序部署到集群中,且不是传统的绑定到单个机器上。为了利用这种新的部署模型,应用程序需要以一种将它们与单个主机分离的方式打包——容器化。在传统的部署模型中,应用程序直接安装到特定的机器上,与主机深度集成,与传统部署模型相比,容器化的应用程序更加灵活可用。Kubernetes以更有效的方式在集群中自动化分发和调度应用程序容器。
Kubernetes集群由两种资源类型组成:Master和Node:
同时Kubernetes将集群中的网络配置及对象的状态信息存储在ETCD集群中,所以还需要一套ETCD集群。
Kubernetes集群是一个功能丰富但有些复杂的系统,不过亲自运行一个系统永远是学习它的最佳开始。
本篇文章是该系列文章的开篇,主要介绍Kubernetes高可用集群的两种主流安装方式:Kubeadm和二进制(这两种安装方式各有优劣,至于生产环境中采用何种方式部署集群,亦或是使用云平台提供的Kubernetes集群,还需根据实际情况选择),以及部署Kubernetes的主要插件。
不论是Kubeadm还是二进制的方式安装Kubernetes集群,都要先初始化安装环境。
以下主机列表是我介绍两种安装方式时使用的主要资源:
对Kubernetes集群环境初始化,需要在集群中的各个节点执行大量相同的命令,为了减少机械、廉价的重复性工作,也为了让读者将更多的心思用到Kubernetes高可用集群本身,我这里采用了简单易上手的Ansible配置管理工具进行初始化工作。
[root@km01 ~]# yum -y install ansible
# 如果提示没有这个安装包,则需要安装epel-releas源,然后再次安装ansible
[root@km01 ~]# yum -y install epel-release
[root@km01 ~]# vim /etc/ansible/hosts
[k8sm]
192.168.0.[11:13]
[k8sn]
192.168.0.[21:22]
[k8sall:children]
k8sm
k8sn
[root@km01 ~]# ssh-keygen -t rsa
[root@km01 ~]# ssh-copy-id 192.168.0.11
[root@km01 ~]# ssh-copy-id 192.168.0.12
...
[root@km01 ~]# ssh-copy-id 192.168.0.22
[root@km01 ~]# ansible k8sall -m ping
2-7步均通过Ansible Playbook实现,Playbook文件我已上传到GitHub,囿于篇幅,这里就不再展开文件内容。项目地址 https://github.com/weiwendi/k8sdeploy,把k8sdeploy
项目拉取到ansible所在的主机上:
[root@km01 ~]# git clone https://github.com/weiwendi/k8sdeploy.git
[root@km01 ~]# cd k8sdeploy/initialize
[root@km01 initialize]# ansible-playbook installPackages.yaml
[root@km01 initialize]# ansible-playbook initEnv.yaml
执行完这两个脚本,就完成了集群环境初始化。
k8sdeploy项目下有七个子目录:addons、app、binary、haproxy、initialize、keepalived、kubeadm,顾名思义,每个目录都有其相关功能:
cd k8sdeploy/initialize
# 安装的依赖包比较多,这个过程会比较慢
ansible-playbook installPackages.yaml
ansible-playbook initEnv.yaml
cd k8sdeploy/kubeadm
ansible-playbook installKubeadm.yam
cp k8sdeploy/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg
# keepalived master node
cp k8sdeploy/keepalived/master-keepalived.conf /etc/keepalived/keepalived.conf
cp k8sdeploy/keepalived/checkHaproxy.sh /etc/keepalived/checkHaproxy.sh
# keepalived backup node
cp k8sdeploy/keepalived/backup-keepalived.conf /etc/keepalived/keepalived.conf
cp k8sdeploy/keepalived/checkHaproxy.sh /etc/keepalived/checkHaproxy.sh
Kubernetes作为重要的容器治理平台,保障其自身高可靠稳定运行尤为重要,这需要我们从三方面考虑:
HaProxy是一个使用C语言编写的自由及开放源代码软件,提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理,并能对后端服务进行健康监测,把流量转发给健康的后端。
在准备好的两台主机(lb01、lb02)上执行以下操作:
yum install -y haproxy
git clone https://github.com/weiwendi/k8sdeploy.git
cp k8sdeploy/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg
在haproxy.cfg文件中,有几处配置需要根据实际环境修改:
默认HaProxy的日志输出在/var/log/messages文件中,为了便于查看及管理,我们把它输出到/var/log/haproxy/haproxy.log文件中:
# 修改/etc/sysconfig/rsyslog文件为如下内容
cat /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-r"
# 修改/etc/rsyslog.conf文件
vim /etc/rsyslog.conf
# 取消以下选项的注释:
$ModLoad imudp
$UDPServerRun 514
#增加以下内容:
# haproxy -r 2
local2.* /var/log/haproxy/haproxy.log
systemctl restart rsyslog
systemctl start haproxy
Keepalived是一个使用C语言编写的自由及开放源代码软件。主要为Linux系统和基于Linux的基础设施提供简单而健壮的高可用性工具,通过VRRP协议实现。
在准备好的两台主机上(lb01、lb02)执行以下操作:
yum install -y keepalived
[root@lb01 ~]# cp k8sdeploy/keepalived/master-keepalived.conf /etc/keepalived/keepalived.conf
[root@lb02 ~]# cp k8sdeploy/keepalived/backup-keepalived.conf /etc/keepalived/keepalived.conf
配置文件中有一些选项需要根据实际环境修改:
cp k8sdeploy/keepalived/checkHaproxy.sh /etc/keepalived/checkHaproxy.sh
chmod +x /etc/keepalived/checkHaproxy.sh
# /etc/sysconfig/keepalived文件内容修改如下:
cat /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -d -S 0"
# 在/etc/rsyslog.conf文件中增加如下内容:
vim /etc/rsyslog.conf
# keepalived -S 0
local0.* /var/log/keepalived/keepalived.log
# 重启rsyslog服务
systemctl restart rsyslog
# 启动keepalived(先启动主,再启动从)
systemctl start keepalived
[root@lb01 ~]# ip addr
到这里,准备环境已经完成,接下来,进入Kubernetes高可用集群的安装。
可以手动停止主节点的HaProxy服务,验证VIP是否自动漂移到从节点。
Kubeadm方式安装Kubernetes集群的过程相对简单,除kubelet外,其他组件均以容器的方式运行,并且支持高可用部署,我们无需考虑ETCD及控制层面的高可用,只需保证在HaProxy中配置了Kube-apiserver的流量负载。
进入k8sdeploy项目的kubeadm目录,执行installKubeadm.yaml安装kubeadm、kubelet和kubectl:
[root@km01 ~]# cd k8sdeploy/kubeadm
[root@km01 kubeadm]# ansible-playbook installKubeadm.yaml
安装完kubeadm工具后,就可以使用该工具安装Kubernetes集群了,我已经创建好了安装Kubernetes集群时依赖的配置文件,但有几个配置项需要根据实际环境修改:
[root@km01 ~]# cd k8sdeploy/kubeadm/kubernetes/
[root@km01 kubernetes]# kubeadm init --config=kubeadm-config.yaml --upload-certs
命令执行完成,终端上会打印很多内容,把类似下面的这段输出拷贝出来:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of the control-plane node running the following command on each as root:
kubeadm join 192.168.0.111:16443 --token 2yzik9.g5tlnr5cr0ocdcr0 \
--discovery-token-ca-cert-hash sha256:3327709183ac204ca1e3e986d9c311a6222d904070c72ee1260a707d9c5d1810 \
--control-plane --certificate-key c672459d595fce1b563e3150e342b692fb4df3a61b51ecd634f05fea5c1a9110
Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.0.111:16443 --token 2yzik9.g5tlnr5cr0ocdcr0 \
--discovery-token-ca-cert-hash sha256:3327709183ac204ca1e3e986d9c311a6222d904070c72ee1260a707d9c5d1810
...
按照输出内容,配置Kubernetes集群的命令行管理工具kubectl:
[root@km01 ~]# mkdir -p $HOME/.kube
[root@km01 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
实现Kubernetes集群网络的方案很多,Calico工具就实现了一个很优秀的Kubernetes集群网络解决方案:
[root@km01 ~]# cd k8sdeploy/addons/calico/
[root@km01 calico]# kubectl apply -f calico.yaml
calico.yaml文件中也有两处配置需要注意:
输出内容中提示了如何将新的Master加入集群,粘贴并在目标主机执行:
# Master2
[root@km02 ~]# kubeadm join 192.168.0.111:16443 --token 2yzik9.g5tlnr5cr0ocdcr0 \
--discovery-token-ca-cert-hash sha256:3327709183ac204ca1e3e986d9c311a6222d904070c72ee1260a707d9c5d1810 \
--control-plane --certificate-key c672459d595fce1b563e3150e342b692fb4df3a61b51ecd634f05fea5c1a9110
# Master3
[root@km02 ~]# kubeadm join 192.168.0.111:16443 --token 2yzik9.g5tlnr5cr0ocdcr0 \
--discovery-token-ca-cert-hash sha256:3327709183ac204ca1e3e986d9c311a6222d904070c72ee1260a707d9c5d1810 \
--control-plane --certificate-key c672459d595fce1b563e3150e342b692fb4df3a61b51ecd634f05fea5c1a9110
输出内容中同样提示了如何将Node加入集群,粘贴并在目标主机执行:
# Node1
[root@kn01 ~]# kubeadm join 192.168.0.111:16443 --token 2yzik9.g5tlnr5cr0ocdcr0 \
--discovery-token-ca-cert-hash sha256:3327709183ac204ca1e3e986d9c311a6222d904070c72ee1260a707d9c5d1810
# Node2
[root@kn02 ~]# kubeadm join 192.168.0.111:16443 --token 2yzik9.g5tlnr5cr0ocdcr0 \
--discovery-token-ca-cert-hash sha256:3327709183ac204ca1e3e986d9c311a6222d904070c72ee1260a707d9c5d1810
集群安装完成了,可以使用命令查看组件的运行状态:
# 查看集群状态
[root@km01 ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
[root@km01 ~]# curl -k https://192.168.0.111:16443/healthz
ok
# 查看集群中的主机
[root@km01 ~]# kubectl get nodes
Dashboard 是基于网页的 Kubernetes 用户界面。可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源(如 Deployment,Job,DaemonSet 等等)。例如,可以对 Deployment 实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。
我在k8sdeploy/addons/dashboard/目录下已经准备好了部署Dashboard的yaml文件,端口类型为NodePort,监听TCP30000端口,如果你集群中各主机的30000端口已被占用,请修改此文件的NodePort值及HaProxy配置文件中的对应端口号:
[root@km01 ~]# cd k8sdeploy/addons/dashboard/
[root@km01 dashboard]# kubectl apply -f dashboard.yaml
# 查看dashboard的运行情况
[root@km01 dashboard]# kubectl get pods -n kubernetes-dashboard
[root@km01 dashboard]# kubectl get services -n kubernetes-dashboard
Dashboard部署完成后,在浏览器中输入https://vip:17443访问,因为用的是IP地址,而Dashboard又不支持HTTP,所以会提示证书问题,点击“高级”按钮,点击“继续访问”。登录时的验证方式有Kubeconfig和token两种,建议采用token方式。查看token:
[root@km01 ~]# kubectl get secret -n kubernetes-dashboard
[root@km01 ~]# kubectl describe secret kubernetes-dashboard-token-ddxbs -n kubernetes-dashboard
这就是使用Kubeadm部署高可用Kubernetes集群的相关步骤,整个过程还是很简单的。接下来介绍使用二进制包部署高可用Kubernetes集群。
拷贝token字段的值,粘贴进浏览器的验证框,点击“登录”按钮。
采用二进制包安装相比Kubeadm会复杂一些,但维护相对简单。
[root@km01 ~]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
[root@km01 ~]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson
[root@km01 ~]# chmod +x /usr/local/bin/cfssl*
[root@km01 ~]# cfssl version
[root@km01 ~]# cd k8sdeploy/binary/pki
[root@km01 pki]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
# 生成的ca-key.pem和ca.pem便是我们需要的密钥和证书
[root@km01 pki]# ls
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem
# 将ca-key.pem和ca.pem拷贝到每个主节点的/etc/kubernetes/pki/目录
# 创建/etc/kubernetes/pki/目录
[root@km01 pki]# ansible k8sm -m file -a 'dest=/etc/kubernetes/pki/ state=directory'
# 拷贝文件
[root@km01 pki]# scp *.pem 192.168.0.16:/etc/kubernetes/pki/
[root@km01 pki]# scp *.pem 192.168.0.17:/etc/kubernetes/pki/
[root@km01 pki]# scp *.pem 192.168.0.18:/etc/kubernetes/pki/
Kubernetes1.17.0相关的二进制包我上传在了百度网盘,链接:https://pan.baidu.com/s/1sMyqWZCwzAEHuCZAmREKJg,提取码:6jr2
,保存到/tmp目录下:
[root@km01 ~]# wget -P /tmp/ https://dl.k8s.io/v1.17.0/kubernetes-server-linux-amd64.tar.gz
[root@km01 ~]# tar zxf /tmp/kubernetes-server-linux-amd64.tar.gz -C /tmp/
需要将这些包解压到Ansible节点的/tmp目录,方便包分发。
ETCD3.3.18的官方GitHub下载地址:
[root@km01 ~]# wget -P /tmp/ https://github.com/etcd-io/etcd/releases/download/v3.3.18/etcd-v3.3.18-linux-amd64.tar.gz
[root@km01 ~]# tar zxf /tmp/etcd-v3.3.18-linux-amd64.tar.gz -C /tmp/
在k8sdeploy/binary/deployEtcd/目录中,已经准备好了自动部署ETCD集群的Ansible脚本。
[root@km01 ~]# cd k8sdeploy/binary/pki/etcd
[root@km01 etcd]# cfssl gencert -ca=../ca.pem -ca-key=../ca-key.pem -config=../ca-config.json -profile=kubernetes etcd-csr.json | cfssljson -bare etcd
[root@km01 etcd]# ls etcd*.pem
这些证书及私钥需要拷贝到ETCD节点的/etc/kubernetes/pki/目录中,已在Ansible脚本里实现,无需手动拷贝。
[root@km01 deployEtcd]# ansible-playbook deployEtcd.yaml
# 查看ETCD节点信息
[root@km01 deployEtcd]# etcdctl --ca-file=/etc/kubernetes/pki/ca.pem --cert-file=/etc/kubernetes/pki/etcd.pem --key-file=/etc/kubernetes/pki/etcd-key.pem member list
[root@km01 ~]# cd k8sdeploy/binary/pki/api-server
[root@km01 api-server]# cfssl gencert -ca=../ca.pem \
-ca-key=../ca-key.pem \
-config=../ca-config.json -profile=kubernetes \
kubernetes-csr.json | cfssljson -bare kubernetes
[root@km01 ~]# cd k8sdeploy/binary/deployApiServer
[root@km01 deployApiServer]# ansible-playbook deployApiServer.yaml
3.4节配置了高可用集群,在浏览器中访问http://192.168.0.111/admin?stats页面,,查看Kube-apiserver的运行状态,需要把192.168.0.111替换为你的VIP地址。也可以手动停止主HaProxy,验证VIP是否漂移,在此过程中,执行以下命令,看结果是否不同:
curl -k https://192.168.0.17:6443
kubectl可以安装在连通Kubernetes集群的任一主机上,本环境在192.168.0.16Master主机上。
[root@km01 ~]# cp -a /tmp/kubernetes/server/bin/kubectl /usr/local/bin/
[root@km01 ~]# mkdir ~/.kube
[root@km01 ~]# cd k8sdeploy/binary/pki/kubectl
[root@km01 kubectl]# cfssl gencert -ca=../ca.pem \
-ca-key=../ca-key.pem -config=../ca-config.json \
-profile=kubernetes \
admin-csr.json | cfssljson -bare admin
# 设置集群参数,--server的地址是VIP的地址及端口
[root@km01 kubectl]# kubectl config set-cluster kubernetes \
--certificate-authority=../ca.pem \
--embed-certs=true \
--server=https://192.168.0.111:16443 \
--kubeconfig=kube.config
# 设置客户端认证参数
[root@km01 kubectl]# kubectl config set-credentials admin \
--client-certificate=admin.pem \
--client-key=admin-key.pem \
--embed-certs=true \
--kubeconfig=kube.config
# 设置上下文参数
[root@km01 kubectl]# kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=admin \
--kubeconfig=kube.config
# 设置默认上下文
[root@km01 kubectl]# kubectl config use-context kubernetes --kubeconfig=kube.config
# 将kube.config文件拷贝到~/.kube/目录
[root@km01 kubectl]# cp kube.config ~/.kube/config
[root@km01 kubectl]# kubectl create clusterrolebinding kube-apiserver:kubelet-apis \
--clusterrole=system:kubelet-api-admin --user kubernetes
# 查看集群信息
[root@km01 kubectl]# kubectl cluster-info
[root@km01 kubectl]# kubectl get all --all-namespaces
[root@km01 kubectl]# kubectl get componentstatuses
[root@km01 ~]# cd k8sdeploy/binary/pki/kube-controller-manager
[root@km01 kube-controller-manager]# cfssl gencert -ca=../ca.pem \
-ca-key=../ca-key.pem -config=../ca-config.json \
-profile=kubernetes kube-controller-manager-csr.json | cfssljson \
-bare controller-manager
[root@km01 kube-controller-manager]# ls controller-manager*
controller-manager.csr controller-manager-key.pem controller-manager.pem
生成的三个文件需要拷贝到每个Master主机,该步骤已包含在Ansible Playbook文件中。
# 创建kubeconfig
[root@km01 kube-controller-manager]# kubectl config set-cluster kubernetes \
--certificate-authority=../ca.pem --embed-certs=true \
--server=https://192.168.0.111:16443 \
--kubeconfig=kube-controller-manager.kubeconfig
root@km01 kube-controller-manager]# kubectl config set-credentials \
system:kube-controller-manager --client-certificate=controller-manager.pem \
--client-key=controller-manager-key.pem --embed-certs=true \
--kubeconfig=kube-controller-manager.kubeconfig
[root@km01 kube-controller-manager]# kubectl config set-context \
system:kube-controller-manager --cluster=kubernetes \
--user=system:kube-controller-manager \
--kubeconfig=kube-controller-manager.kubeconfig
[root@km01 kube-controller-manager]# kubectl config use-context \
system:kube-controller-manager \
--kubeconfig=kube-controller-manager.kubeconfig
将kube-controller-manager.kubeconfig分发到所有Master主机,该步骤已包含在Ansible Playbook文件中。
[root@km01 deployControllerManager]# ansible-playbook deployControllerManager.yaml
[root@km01 ~]# cd k8sdeploy/binary/pki/kube-scheduler
[root@km01 kube-scheduler]# cfssl gencert -ca=../ca.pem \
-ca-key=../ca-key.pem -config=../ca-config.json \
-profile=kubernetes kube-scheduler-csr.json | cfssljson \
-bare kube-scheduler
[root@km01 kube-scheduler]# kubectl config set-cluster kubernetes \
--certificate-authority=../ca.pem --embed-certs=true \
--server=https://192.168.0.111:16443 \
--kubeconfig=kube-scheduler.kubeconfig
[root@km01 kube-scheduler]# kubectl config set-credentials \
system:kube-scheduler --client-certificate=kube-scheduler.pem \
--client-key=kube-scheduler-key.pem --embed-certs=true \
--kubeconfig=kube-scheduler.kubeconfig
[root@km01 kube-scheduler]# kubectl config set-context \
system:kube-scheduler --cluster=kubernetes \
--user=system:kube-scheduler \
--kubeconfig=kube-scheduler.kubeconfig
[root@km01 kube-scheduler]# kubectl config use-context system:kube-scheduler --kubeconfig=kube-scheduler.kubeconfig
将kube-scheduler.kubeconfig分发到所有Master主机,该步骤已包含在Ansible Playbook文件中。
[root@km01 deployScheduler]# ansible-playbook deployScheduler.yaml
# 创建token
[root@km01 ~]# cd k8sdeploy/binary/pki/kubectl
[root@km01 kubectl]# export BOOTSTRAP_TOKEN=$(/tmp/kubernetes/server/bin/kubeadm token create \
--description kubelet-bootstrap-token \
--groups system:bootstrappers:worker \
--kubeconfig kube.config)
# 设置集群参数
[root@km01 kubectl]# kubectl config set-cluster kubernetes \
--certificate-authority=../ca.pem \
--embed-certs=true \
--server=https://192.168.0.111:6443 \
--kubeconfig=kubelet-bootstrap.kubeconfig
# 设置客户端认证参数
[root@km01 kubectl]# kubectl config set-credentials kubelet-bootstrap \
--token=${BOOTSTRAP_TOKEN} \
--kubeconfig=kubelet-bootstrap.kubeconfig
# 设置上下文参数
[root@km01 kubectl]# kubectl config set-context default \
--cluster=kubernetes \
--user=kubelet-bootstrap \
--kubeconfig=kubelet-bootstrap.kubeconfig
# 设置默认上下文
[root@km01 kubectl]# kubectl config use-context default --kubeconfig=kubelet-bootstrap.kubeconfig
把生成的kubelet-bootstrap.kubeconfig文件拷贝到每个Node上,因为我们Master也安装了Kubelet,也需要拷贝到Master上。另外还需要把ca.pem证书拷贝到Node节点的/etc/kubernetes/pki目录中。
[root@km01 kubectl]# kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --group=system:bootstrappers
[root@km01 deployKubelet]# ansible-playbook deployKubelet.yaml
[root@km01 ~]# kubectl get csr
[root@km01 ~]# kubectl certificate approve <name>
[root@km01 ~]# cd k8sdeploy/binary/pki/kube-proxy
[root@km01 kube-proxy]# cfssl gencert -ca=../ca.pem \
-ca-key=../ca-key.pem -config=../ca-config.json \
-profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
# 创建kube-proxy.kubeconfig
[root@km01 kube-proxy]# kubectl config set-cluster kubernetes \
--certificate-authority=../ca.pem --embed-certs=true \
--server=https://192.168.0.111:16443 --kubeconfig=kube-proxy.kubeconfig
[root@km01 kube-proxy]# kubectl config set-credentials kube-proxy \
--client-certificate=kube-proxy.pem --client-key=kube-proxy-key.pem \
--embed-certs=true --kubeconfig=kube-proxy.kubeconfig
[root@km01 kube-proxy]# kubectl config set-context default --cluster=kubernetes \
--user=kube-proxy --kubeconfig=kube-proxy.kubeconfig
[root@km01 kube-proxy]# kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
[root@km01 deployKubeProxy]# ansible-playbook deployKubeProxy.yaml
[root@km01 ~]# cd k8sdeploy/addons/calico/
[root@km01 calico]# kubectl apply -f calico.yaml
CoreDNS 是一个灵活可扩展的 DNS 服务器,可以作为 Kubernetes 集群 的DNS。与 Kubernetes 一样,CoreDNS 项目由 CNCF 持有。
[root@km01 ~]# cd k8sdeploy/addons/coredns/
[root@km01 calico]# kubectl apply -f coredns.yaml
[root@km01 ~]# cd k8sdeploy/addons/dashboard/
[root@km01 dashboard]# kubectl apply -f dashboard.yaml
我们已经正常运行了Calico、CoreDNS和DashBoard,但谨慎起见,可通过以下几项,验证集群可用性:
部署Nginx Deployment:
[root@km01 ~]# cd k8sdeploy/app/nginx
[root@km01 nginx]# kubectl apply -f nginx.yaml
# 测试pod ip的连通性
# 获取nginx pod的IP地址,在集群中任意节点上ping该IP
[root@km01 nginx]# kubectl get pod -o wide
# 测试service ip及nodePort的连通性
# 获取nginx service的IP和nodePort,在集群中任意节点上curl该地址
[root@km01 nginx]# kubectl get service
[root@km01 nginx]# curl http://serviceip
[root@km01 nginx]# curl http://nodeIP:nodePort
使用kubectl exec命令登录nginx pod容器:
[root@km01 nginx]# kubectl exec -it nginx-85545d47d4-x8smd sh
# ping kubernetes
# ping nginx
# ping kube-dns.kube-system
# Kubernetes Service禁ping了,但能正确解析到域名的IP地址
Service的名称格式:service-name.namespace.svc.cluster.local。
Binary的安装也介绍完了,相比Kubeadm方式是不是复杂了很多,不过也没关系,我们已经搞定了。
接下来,介绍在Kubernetes集群中部署程序,以及生产中的常用操作。
文章转载自魏文弟。