原创:利用 kubeadm 1.15 生成 etcd 证书

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原创:利用 kubeadm 1.15 生成 etcd 证书相关的知识,希望对你有一定的参考价值。

参考技术A etcd 一般通过 cfssl 或 openssl 生成证书, 增加了 kubernetes 集群的部署复杂度。本文描述了通过kubeadm自动化生成etcd的ca证书,以达到简化部署难度的目的。本文的编写参考了以前旧版本的思路,针对kubeadm 1.15 版本的变化做了更新。

参考文档:
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init-phase/#cmd-phase-etcd
https://blog.scottlowe.org/2018/08/21/bootstrapping-etcd-cluster-with-tls-using-kubeadm/
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/

干货|使用kubeadm部署kubernetes集群

每天读一篇一线开发者原创好文

使用kubeadm部署kubernetes集群

通过docker,我们可以在单个主机上快速部署各个应用,但是实际的生产环境里,不会单单存在一台主机,这就需要用到docker集群管理工具了,本文将简单介绍使用docker集群管理工具kubernetes进行集群部署。


1 环境规划与准备

本次搭建使用了三台主机,其环境信息如下:
| 节点功能 | 主机名 | IP |
| ——————|:—————-:|——————-:|
| master | master |192.168.1.11 |
| slave1 | slave1 |192.168.1.12 |
| slave2 | slave2 |192.168.1.13 |

在三台主机的/etc/hosts文件中添加以下内容

 
   
   
 
  1. vim /etc/hosts

  2. #添加以下信息

  3. 192.168.1.11 master

  4. 192.168.1.12 slave1

  5. 192.168.1.13 slave2

关闭swap

 
   
   
 
  1. swapoff -a

再把/etc/fstab文件中带有swap的行注释。


关闭SELinux

 
   
   
 
  1. setenforce 0

  2. vim /etc/sysconfig/selinux

  3. #修改SELINUX属性

  4. SELINUX=disabled

设置iptables

 
   
   
 
  1. cat <<EOF >  /etc/sysctl.d/k8s.conf

  2. > net.bridge.bridge-nf-call-ip6tables = 1

  3. > net.bridge.bridge-nf-call-iptables = 1

  4. > EOF

  5. sysctl --system

安装socat等工具

 
   
   
 
  1. yum install -y ebtables socat

2 kubernetes安装

2.1 安装docker

官方推荐安装docker版本为1.12

 
   
   
 
  1. #yum安装docker

  2. yum install -y docker

  3. #设置docker开机启动

  4. systemctl enable docker

  5. #启动docker

  6. systemctl start docker

验证docker版本

 
   
   
 
  1. docker --version

  2. #以下为输出的版本信息

  3. Docker version 1.12.6, build 85d7426/1.12.6

2.2 安装kubectl、kubelet、kubeadm

2.2.1 添加yum源

常用yum源均没有这几个安装包,需要添加专门的yum源

 
   
   
 
  1. cat <<EOF > /etc/yum.repos.d/kubernetes.repo

  2. [kubernetes]

  3. name=Kubernetes

  4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64

  5. enabled=1

  6. gpgcheck=0

  7. EOF

  8. #官方文档中的yum源为google,国内无法使用

2.2.2 安装kubectl、kubelet、kubeadm

 
   
   
 
  1. yum install -y kubelet kubeadm kubectl

2.2.3 启动kubelet

 
   
   
 
  1. #设置开机启动kubelet

  2. systemctl enable kubelet

  3. #启动kubelet

  4. systemctl start kubelet

查询kubelet的状态

 
   
   
 
  1. systemctl status kubelet

初次安装的情况下kubelet应未启动成功,我们会按下面的步骤初始化集群后会自动启动的。


3 kubernetes集群配置

3.1 master节点配置

3.1.1 初始化master

根据官方文档进行初始化:

 
   
   
 
  1. kubeadm init --apiserver-advertise-address 192.168.1.11 --pod-network-cidr 10.244.0.0/16

  2. #--apiserver-advertise-address 192.168.1.11为master节点IP,部分文档也指定为0.0.0.0

  3. #--pod-network-cidr 10.244.0.0/16为pod网络cidr

出现如下错误:

 
   
   
 
  1. [kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.

  2. unable to get URL "https://storage.googleapis.com/kubernetes-release/release/stable-1.7.txt": Get https://storage.googleapis.com/kubernetes-release/release/stable-1.7.txt: net/http: TLS handshake timeout

需要指定kubernetes-version。

首先查询版本

 
   
   
 
  1. kubeadm version

  2. kubeadm version: &version.Info{Major:"1", Minor:"7", GitVersion:"v1.7.5",…………

版本为1.7.5,然后启动参数中加入版本:

 
   
   
 
  1. kubeadm init --apiserver-advertise-address 192.168.1.11 --pod-network-cidr 10.244.0.0/16 --kubernetes-version=v1.7.5

3.1.2 master节点依赖镜像

执行过程中会卡在如下步骤:

 
   
   
 
  1. [apiclient] Created API client, waiting for the control plane to become ready

因为kubenetes初始化启动会依赖某些镜像,而这些镜像默认会到google下载,我们需要手动下载下来这些镜像后再进行初始化。

使用CTRL+C结束当前进程,然后到/etc/kubernetes/manifests/目录下查看各个yaml文件,还有其他需要的镜像文件,汇总后如下:

 
   
   
 
  1. gcr.io/google_containers/etcd-amd64:3.0.17

  2. gcr.io/google_containers/kube-apiserver-amd64:v1.7.5

  3. gcr.io/google_containers/kube-controller-manager-amd64:v1.7.5

  4. gcr.io/google_containers/kube-scheduler-amd64:v1.7.5

  5. gcr.io/google_containers/pause-amd64:3.0

  6. gcr.io/google_containers/kube-proxy-amd64:v1.7.5

  7. quay.io/coreos/flannel

  8. gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.4

  9. gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.4

  10. gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.4

因直接下载这些google镜像,下载不下来,我们通过下载dockerHUB/阿里云上的镜像,然后更改tag。

 
   
   
 
  1. #etcd-amd64:3.0.17

  2. docker pull sylzd/etcd-amd64-3.0.17

  3. docker tag docker.io/sylzd/etcd-amd64-3.0.17:latest gcr.io/google_containers/etcd-amd64:3.0.17

  4. #kube-apiserver-amd64:v1.7.5

  5. docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/kube-apiserver-amd64:v1.7.5

  6. docker tag registry.cn-hangzhou.aliyuncs.com/google-containers/kube-apiserver-amd64:v1.7.5 gcr.io/google_containers/kube-apiserver-amd64:v1.7.5

  7. #kube-controller-manager-amd64:v1.7.5

  8. docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/kube-controller-manager-amd64:v1.7.5

  9. docker tag registry.cn-hangzhou.aliyuncs.com/google-containers/kube-controller-manager-amd64:v1.7.5 gcr.io/google_containers/kube-controller-manager-amd64:v1.7.5

  10. #kube-scheduler-amd64:v1.7.5

  11. docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/kube-scheduler-amd64:v1.7.5

  12. docker tag registry.cn-hangzhou.aliyuncs.com/google-containers/kube-scheduler-amd64:v1.7.5 gcr.io/google_containers/kube-scheduler-amd64:v1.7.5

  13. #pause-amd64:3.0

  14. docker pull visenzek8s/pause-amd64:3.0

  15. docker tag visenzek8s/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0

  16. #kube-proxy-amd64:v1.7.5

  17. docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.7.5

  18. docker tag mirrorgooglecontainers/kube-proxy-amd64:v1.7.5 gcr.io/google_containers/kube-proxy-amd64:v1.7.5

  19. #quay.io/coreos/flannel

  20. docker pull quay.io/coreos/flannel

  21. #k8s-dns-kube-dns-amd64:1.14.4

  22. docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/k8s-dns-kube-dns-amd64:1.14.4

  23. docker tag registry.cn-hangzhou.aliyuncs.com/google-containers/k8s-dns-kube-dns-amd64:1.14.4 gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.4

  24. #k8s-dns-sidecar-amd64:1.14.4

  25. docker pull registry.cn-hangzhou.aliyuncs.com/google-containers/k8s-dns-sidecar-amd64:1.14.4

  26. docker tag registry.cn-hangzhou.aliyuncs.com/google-containers/k8s-dns-sidecar-amd64:1.14.4 gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.4

  27. #k8s-dns-dnsmasq-nanny-amd64:1.14.4

  28. docker pull mirrorgooglecontainers/k8s-dns-dnsmasq-nanny-amd64:1.14.4

  29. docker tag mirrorgooglecontainers/k8s-dns-dnsmasq-nanny-amd64:1.14.4 gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.4

master节点初始化成功,结果如下:

 
   
   
 
  1. Your Kubernetes master has initialized successfully!

  2. To start using your cluster, you need to run (as a regular user):

  3.  mkdir -p $HOME/.kube

  4.  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

  5.  sudo chown $(id -u):$(id -g) $HOME/.kube/config

  6. You should now deploy a pod network to the cluster.

  7. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:

  8.  http://kubernetes.io/docs/admin/addons/

  9. You can now join any number of machines by running the following on each node

  10. as root:

  11.  kubeadm join --token 3f1db4.9f7ba7d52de40996 192.168.1.11:6443

需要记住kubeadm join —token这句,后面会用到


3.1.3 kubectl配置

 
   
   
 
  1. #对于非root用户

  2. mkdir -p $HOME/.kube

  3. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

  4. sudo chown $(id -u):$(id -g) $HOME/.kube/config

  5. #对于root用户

  6. export KUBECONFIG=/etc/kubernetes/admin.conf

3.1.4 pod network配置

 
   
   
 
  1. kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

安装完network之后,你可以通过kubectl get pods —all-namespaces来查看kube-dns是否在running来判断network是否安装成功。

 
   
   
 
  1. kubectl get pods --all-namespaces

  2. #运行正常的结果如下:

  3. NAMESPACE     NAME                                            READY     STATUS    RESTARTS   AGE

  4. kube-system   etcd-localhost.localdomain                      1/1       Running   0          1h

  5. kube-system   kube-apiserver-localhost.localdomain            1/1       Running   0          1h

  6. kube-system   kube-controller-manager-localhost.localdomain   1/1       Running   3          1h

  7. kube-system   kube-dns-2425271678-27g6v                       3/3       Running   0          1h

  8. kube-system   kube-flannel-ds-1mjq3                           1/1       Running   1          1h

  9. kube-system   kube-proxy-mtjwb                                1/1       Running   0          1h

  10. kube-system   kube-scheduler-localhost.localdomain            1/1       Running   0          1h

如果以上STATUS中存在不是Running的需要再进行解决。

由于安全原因,默认情况下pod不会被schedule到master节点上,可以通过下面命令解除这种限制:

 
   
   
 
  1. kubectl taint nodes --all node-role.kubernetes.io/master-

3.2 slave节点配置

3.2.1 slave节点依赖镜像

slave节点需要以下镜像:

 
   
   
 
  1. gcr.io/google_containers/kube-proxy-amd64:v1.7.5

  2. quay.io/coreos/flannel

  3. gcr.io/google_containers/pause-amd64:3.0

在msater节点上导出镜像

 
   
   
 
  1. docker save -o /opt/kube-pause.tar gcr.io/google_containers/pause-amd64:3.0

  2. docker save -o /opt/kube-proxy.tar gcr.io/google_containers/kube-proxy-amd64:v1.7.5

  3. docker save -o /opt/kube-flannel.tar quay.io/coreos/flannel

复制到slave主机/opt目录下,再导入即可:

 
   
   
 
  1. docker load -i /opt/kube-flannel.tar

  2. docker load -i /opt/kube-proxy.tar

  3. docker load -i /opt/kube-pause.tar

3.2.2 slave节点加入集群

在两个slave节点上执行:

 
   
   
 
  1. kubeadm join --token 3f1db4.9f7ba7d52de40996 192.168.1.11:6443

执行成功标志:

 
   
   
 
  1. Node join complete:

  2. * Certificate signing request sent to master and response

  3.  received.

  4. * Kubelet informed of new secure connection details.

  5. Run 'kubectl get nodes' on the master to see this machine join.

在mster节点上执行kubectl get nodes查看是否成功:

 
   
   
 
  1. kubectl get nodes

  2. NAME      STATUS    AGE       VERSION

  3. master    Ready     56m       v1.7.5

  4. slave1    Ready     1m        v1.7.5

  5. slave2    Ready     1m        v1.7.5

可以看到,kubernetes集群已经部署成功,可以使用了。


参考资料

  1. Installing kubeadm,https://kubernetes.io/docs/setup/independent/install-kubeadm/

  2. 使用kubeadm在Red Hat 7/CentOS 7快速部署Kubernetes 1.7集群,http://dockone.io/article/2514

  3. CentOS7.3利用kubeadm安装kubernetes1.7.3完整版(官方文档填坑篇),https://www.cnblogs.com/liangDream/p/7358847.html

  4. How to execute “kubeadm init” v1.6.4 behind firewall,https://stackoverflow.com/questions/44432328/how-to-execute-kubeadm-init-v1-6-4-behind-firewall

  5. 使用 kubeadm 创建 kubernetes 1.9 集群,https://www.kubernetes.org.cn/3357.html


如有疑问,欢迎交流


拓展阅读



以上是关于原创:利用 kubeadm 1.15 生成 etcd 证书的主要内容,如果未能解决你的问题,请参考以下文章

kubeadm安装Kubernetes 1.15 实践

kubeadm安装高可用kubernetes v1.14.1

Kubernetes 1.16.15升级到1.17.17

kubeadm 专题 一 init 究竟干了些啥

k8s-v1.15升级v1.16-已解决

openssl 证书生成笔记(go 1.15版本以上)