kubernetes集群搭建总结
1、安装kubelet、kubeadm、kubectl
2、查看所需镜像
命令:kubeadm config images list
结果:
k8s.gcr.io/kube-apiserver:v1.18.3
k8s.gcr.io/kube-controller-manager:v1.18.3
k8s.gcr.io/kube-scheduler:v1.18.3
k8s.gcr.io/kube-proxy:v1.18.3
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7
3、下载镜像并保存到本地私有库
从阿里云镜像仓库获取这些镜像:
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.18.2
注意:通过命令获取到的都是最新的镜像版本,但阿里云可能没有最新的,比如我执行的时候给出的版本是1.18.3,但阿里云镜像只有1.18.2,所以就获取老版本镜像。
都下载完成后,就打上自己私有库的tag,然后上传到私有库,这样其它机器部署时可以直接从私有库下载。
docker tag k8s.gcr.io/kube-proxy:v1.18.2 192.168.31.151:5000/google_containers/kube-proxy:v1.18.2
docker push 192.168.31.151:5000/google_containers/kube-proxy:v1.18.2
docker tag k8s.gcr.io/kube-apiserver:v1.18.2 192.168.31.151:5000/google_containers/kube-apiserver:v1.18.2
docker push 192.168.31.151:5000/google_containers/kube-apiserver:v1.18.2
docker tag k8s.gcr.io/kube-controller-manager:v1.18.2 192.168.31.151:5000/google_containers/kube-controller-manager:v1.18.2
docker push 192.168.31.151:5000/google_containers/kube-controller-manager:v1.18.2
docker tag k8s.gcr.io/kube-scheduler:v1.18.2 192.168.31.151:5000/google_containers/kube-scheduler:v1.18.2
docker push 192.168.31.151:5000/google_containers/kube-scheduler:v1.18.2
docker tag k8s.gcr.io/pause:3.2 192.168.31.151:5000/google_containers/pause:3.2
docker push 192.168.31.151:5000/google_containers/pause:3.2
docker tag k8s.gcr.io/etcd:3.4.3-0 192.168.31.151:5000/google_containers/etcd:3.4.3-0
docker push 192.168.31.151:5000/google_containers/etcd:3.4.3-0
docker tag k8s.gcr.io/coredns:1.6.7 192.168.31.151:5000/google_containers/coredns:1.6.7
docker push 192.168.31.151:5000/google_containers/coredns:1.6.7
其它机器部署时可以执行如下脚本,直接从私有库全部获取。
images=(
kube-apiserver:v1.18.2
kube-controller-manager:v1.18.2
kube-scheduler:v1.18.2
kube-proxy:v1.18.2
pause:3.2
etcd:3.4.3-0
coredns:1.6.7
)
for imageName in ${images[@]} ; do
docker pull 192.168.31.151:5000/google_containers/$imageName
docker tag 192.168.31.151:5000/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi 192.168.31.151:5000/google_containers/$imageName
done;
4、初始化
执行如下命令初始化
kubeadm init --image-repository 192.168.31.151:5000/google_containers --kubernetes-version v1.18.2 --apiserver-advertise-address 192.168.31.151 --pod-network-cidr=222.222.0.0/16
kubeadm init --image-repository 192.168.31.151:5000/google_containers --kubernetes-version v1.18.2 --apiserver-advertise-address 192.168.31.152 --pod-network-cidr=222.222.0.0/16
以上这是两台机器的初始化命令。当然初始化之前还有其它步骤,比如关闭swap,防火墙放行端口,允许ipv4转发。
在初始化命令几个参数的作用:
--image-repository 192.168.31.151:5000/google_containers:指定私有仓库的地址,否则它又跑到不可访问的google仓库去获取。
--kubernetes-version v1.18.2:指定kubernetes版本,否则它就按照最新版本号去仓库里下载镜像。
--apiserver-advertise-address 192.168.31.151:指定apiserver的访问地址,否则它就指定为找到的一个网卡,多个网卡时就错了。
--pod-network-cidr=222.222.0.0/16:指定pod的子网地址,注意这个地址不要与机器所在局域网地址重叠,比如网络插件calico的参考地址是192.168.0.0/16,但现在机器所在网段就是192.168.31.0,所以要变更下calico的子网地址,否则在创建dashboard时会导致无法访问地址为10.96.0.1的apiserver的服务。
这里有对这个问题的说明:
https://github.com/kubernetes/dashboard/issues/3709#issuecomment-479075477。
可以查看下service的地址:
通过如下命令查询的内容可以看到pod和service的子网段分布。
kubectl -n kube-system edit cm kubeadm-config
当然如果不对参数--pod-network-cidr进行修改,仍然保持pod网段与主机网段重叠也没问题,起码初始化、运行及建立集群是没有问题的。
当走到建立dashboard,无法访问10.96.0.1的apiserver服务时,也可以通过calico的控制台calicoctl重置配置pod的ippool,下面是官方切换ippool的操作说明。
https://docs.projectcalico.org/networking/migrate-pools
下面是wsl2下ubuntu的初始化命令。
kubeadm init --image-repository 192.168.31.151:5000/google_containers --kubernetes-version v1.18.2 --apiserver-advertise-address 172.19.20.236 --apiserver-cert-extra-sans="192.168.31.146" --pod-network-cidr=222.222.0.0/16
参数--apiserver-cert-extra-sans是上面其它机器初始化没有的,这是因为现在wsl2内虚拟机的ip是虚拟的,就是172.19.20.236,每次重启都会变化。在不重启的情况下,必须做端口转发后才能通过宿主主机ip从其它机器访问。端口转发后虽然能够连通,但是kubernetes初始化时生成的证书是给172.19.20.236的,我们通过宿主主机的192.168.31.146是无法访问,所以通过这个参数让kubernetes生成的证书也包括宿主主机的地址,从而也能通过宿主主机ip直接访问,当然这都是在使用wsl2时才会考虑的问题。
5、安装网络插件
采用网络插件calico,因为github上一直在更新。
根据官方指导获取calico.yaml,并通过kubectl apply –f calico.yaml创建。
将下载到的镜像打上本地标签,并上传至本地私有仓库。
将calico.yaml中所有涉及的镜像都改成本地地址,这样重新安装时就直接从本地仓库下载镜像了。
docker tag calico/node:v3.14.1 192.168.31.151:5000/calico/node:v3.14.1
docker push 192.168.31.151:5000/calico/node:v3.14.1
docker tag calico/pod2daemon-flexvol:v3.14.1 192.168.31.151:5000/calico/pod2daemon-flexvol:v3.14.1
docker push 192.168.31.151:5000/calico/pod2daemon-flexvol:v3.14.1
docker tag calico/cni:v3.14.1 192.168.31.151:5000/calico/cni:v3.14.1
docker push 192.168.31.151:5000/calico/cni:v3.14.1
docker tag calico/kube-controllers:v3.14.1 192.168.31.151:5000/calico/kube-controllers:v3.14.1
docker push 192.168.31.151:5000/calico/kube-controllers:v3.14.1
6、初始化kubectl访问
执行下面命令,最好保存成脚本,以便于多次执行。
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
为啥要执行上面这三行脚本呢?因为kubectl执行操作是需要读取.kube/config。kubectl只是一个客户端,任何对kubernetes的操作都是通过kubectl连上apiserver完成的。既然要连apiserver,就需要知道apiserver的地址,并且要表明自己的身份,apiserver才能允许你执行操作。在初始化创建apiserver时,会将apiserver的访问地址及客户端身份数据都放在etc/kubernetes/admin.conf中,这里只是将这个文件改成kubectl能访问的地址和名称。其它任何安装了kubectl的机器,只要在home目录下有这个配置文件,都能访问到这台机器的apiserver。
查看/etc/kubernetes/admin.conf会看到,初始化参数--apiserver-advertise-address配置什么地址,这里就显示什么地址。
7、设置master节点
执行如下命令可以让master也被调度安装普通应用的pod,否则只有明确表明可以在master节点上调度的pod才可运行。
kubectl taint node centos7-01 node-role.kubernetes.io/master:NoSchedule-
执行之后可以让master节点既可调度又能执行部署应用pod。
8、安装dashboard
dashboard是kubernetes可视化的web管理应用,安装后方便查看kubernetes运行状态。
按照官方说明通过kubectl apply部署,然后将下载到的镜像打标签上传到私有库以备用。
docker tag kubernetesui/dashboard:v2.0.0 192.168.31.151:5000/kubernetesui/dashboard:v2.0.0
docker push 192.168.31.151:5000/kubernetesui/dashboard:v2.0.0
docker tag kubernetesui/metrics-scraper:v1.0.4 192.168.31.151:5000/kubernetesui/metrics-scraper:v1.0.4
docker push 192.168.31.151:5000/kubernetesui/metrics-scraper:v1.0.4
部署后的dashboard页面不能在master外的其它机器访问,必须通过apiserver访问。
这个时候存储apiserver地址和客户端认证信息的/etc/kubernetes/admin.conf就又出来了。
执行如下命令,通过提取其中的证书和密钥(应该是公钥),生成可导入浏览器的客户端证书。最后一步生成证书时需要设置密码,请牢记,因为后边导入浏览器时还需要输入这个密码。
grep 'client-certificate-data' /etc/kubernetes/admin.conf | head -n 1 | awk '{print $2}' | base64 -d > kubernetes-client.crt
grep 'client-key-data' /etc/kubernetes/admin.conf | head -n 1 | awk '{print $2}' | base64 -d > kubernetes-client.key
openssl pkcs12 -export -clcerts -inkey kubernetes-client.key -in kubernetes-client.crt -out kubernetes-client.p12 -name "kubernetes-client"
通过上面的命令获取了客户端证书,访问时apiserver能够验证访问者的合法身份了,那浏览器如何验证服务器身份呢?这时候后就需要kubernetes初始化时生成的根证书了,就是/etc/kubernetes/pki/ca.crt,下载该根证书并导入浏览器的受信任根证书颁发机构下,这样访问时客户端与服务器就都能互相验证真伪了。
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
dashbaord-token:
eyJhbGciOiJSUzI1NiIsImtpZCI6InJvUFVwYWtfcmc4RWJsRUlpcm5qb3YxcEpNQ1JyczVrSWRnZ3NfdklPeXMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWJ3Nzk5Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIwMWIyMjAwMC0wYzYzLTQ0ZDUtODIxZi02YzVlYmQ2MDI3MWMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.WQaTiFR7ivOtdS7B30gniUuhmFq-EIs7L8RBdtPNdMr2_Giwp9XdtonXCUpbALgshtpjDG8OYkqUmVOmVgs6rbNMgzP_gY8zXu7ykuYETBZuEqoWNyKfAdhgbINS4wQneoBpI9Co76vZCO5IOsmW-Rn0QRaEiK_oWOg8uUtKv4_HkamdoZISRwGwzE90jbMuyWIEnnhEwJjLDvPqcp3NnlkXqjr0mJzTHCN6X26rZRJ3IijNb_7Ak9fR3O3lwfJtfiKp7uw33Twl2yzXGB3eLyYU5dNHvKzn6JHt77FM3hAUtI1b2bbR8_NTZin2nqjmB1mpwg7mnAUlBtHWDjasAw
rm /etc/kubernetes/* -r
rm /var/lib/etcd/* -r
rm /var/lib/kubelet/pki/kubelet* -r
rm /var/lib/cni/* –r
echo 1 > /proc/sys/net/ipv6/conf/default/disable_ipv6
echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6
/etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
kubeadm join 192.168.31.151:6443 --token l14hlx.fpp1flxecssyma2j --discovery-token-ca-cert-hash sha256:fdf60fb3d79faf7d036dc63d7a2bea7286b7e66a3f77c8e50ee2a7b05dfbec23
kubectl drain centos-vm-homepc-02 --delete-local-data --force --ignore-daemonsets
kubectl delete node centos-vm-homepc-02