今天我们来使用kubeadm 安装高可用k8s。

           系统:Centos7

           角色规划如下:

hostnameiprole
k8s-master120.0.40.51master
k8s-master220.0.40.52master
k8s-master320.0.40.53master
k8s-node120.0.40.54node
k8s-node220.0.40.55node
k8s-node320.0.40.56node

 

 

 

 

 

 

 

 

     在下面的部署过程中需要使用SCP进行传输,所以还需要操作机具备SSH到所有节点的连接能力。为了保证高可用性,Maste服务器至少需要有三台;外置etcd的方案则需要有三台以上的etcd服务器。

我们现在来配置堆叠etcd方式的高可用k8s集群:

一、准备工作:(所有节点执行)

1.关闭selinux。
 
2.关闭防火墙。
 
3.配置hosts,修改hostname
4.时间同步
yum -y install ntp
ntptime
timedatectl
systemctl enable ntpd
systemctl restart ntpd.service
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
5.配置免密登录

二、 安装Docker(所有节点执行)

1.安装yum管理工具及其依赖   

yum install -y yum-utils device-mapper-persistent-data lvm2

2.添加yum源

 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3.安装docker-ce18

 yum -y install docker-ce-18.09.6

4.配置镜像加速器(ps镜像加速器很多,可以自己查找)

echo '{"registry-mirrors":["https://registry.docker-cn.com"]}' > /etc/docker/daemon.json

5.启动docker

 systemctl start docker && systemctl enable docker

三  kubeadm 准备环境(所有节点执行)

1.添加阿里源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

2.关闭swap

swapoff -a   

3.安装并启动kubelet

yum install -y kubelet-1.14.0 kubeadm-1.14.0 kubectl-1.14.0 --disableexcludes=kubernetes
systemctl enable kubelet && systemctl start kubelet

4.更改swap限制

# cat /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=--fail-swap-on=false

5.编辑文件/usr/lib/systemd/system/docker.service(这个步骤可做,可不做。)

ExecStart=/usr/bin/dockerd --exec-opt native.cgroupdriver=systemd
systemctl daemon-reload
systemctl restart docker

四、在k8s-master1节点上准备镜像,配置HAproxy

1.拉取etcd,kube-apiserver,kube-proxy,kube-controller-manger,kube-sheduler镜像(在k8s-master1上执行)

# cat init-config.yaml 
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
imageRepository: docker.io/dustise
kubernetesVersion: v1.14.0
# kubeadm config images pull --config=init-config.yaml
[config/images] Pulled docker.io/dustise/kube-apiserver:v1.14.0
[config/images] Pulled docker.io/dustise/kube-controller-manager:v1.14.0
[config/images] Pulled docker.io/dustise/kube-scheduler:v1.14.0
[config/images] Pulled docker.io/dustise/kube-proxy:v1.14.0
[config/images] Pulled docker.io/dustise/pause:3.1
[config/images] Pulled docker.io/dustise/etcd:3.3.10
[config/images] Pulled docker.io/dustise/coredns:1.3.1

2.配置haproxy(为三台kube-apiserver实现负载均衡,ps:所有节点安装并配置)

yum install -y haproxy
[root@k8s-master1 ~]# cat /etc/haproxy/haproxy.cfg 

listen stats 0.0.0.0:12345
      mode        http
      log         global
      maxconn 10
      stats enable
      stats hide-version
      stats refresh 30s
      stats show-node
      stats auth admin:p@sswOrd
      stats uri  /stats

frontend  kube-api-https
   bind 0.0.0.0:12567
   mode tcp
   default_backend kube-api-server    


backend kube-api-server
    balance     roundrobin
    server  k8s-master1 20.0.40.51:6443 check
    server  k8s-master2 20.0.40.52:6443 check
    server  k8s-master3 20.0.40.53:6443 check
systemctl enable haproxy && systemctl start haproxy

在页面查看,验证(ps:需要输入用户名与密码   自己看配置文件蛤)

五、Kubeadm的安装

1.准备配置文件(k8s-master1上执行)

[root@k8s-master1 ~]# cat kubeadm-config.yaml 
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
imageRepository: docker.io/dustise
kubernetesVersion: v1.14.0
kubernetesVersion: stable
controlPlaneEndpoint: "20.0.40.51:12567"

2.进行初始化

kubeadm init --config=kubeadm-config.yaml  --experimental-upload-certs

3.启用网络

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

4.加入其他节点的master(ps:初始化之后,会出现两条token,第一条token是加入master的,第二条为node的加入)

5.加入node节点

 

6.验证master(ps:不要在意我的版本,我是懒了一丢丢,没有把版本调成统一而已)

 

至此:我们的高可用k8s就搭建完成了

下面简单描述一下整体过程:

etcd的安装有两种方式,我们上述采用的是第一种堆叠方式:etcd服务和控制平面被部署在同样的节点中,对基础设施的要求较低,对故障的应对能力也较低。

外置etcd方案:etcd和控制平面被分离,需要更多的硬件,也有更好的保障能力。

--experimental-upload-certs:

       这个参数专门用于高可用部署,可以将需要在不同的控制平面之间传递的证书文件上传到集群中,以Secret形式保存起来,并且使用Token进行加密。值得注意的是,这个Secret会在两个小时后过期,如果过期就需要使用kubeadm init phase upload-certs --experimental-upload-certs命令重新生成。


     kubeadm在初始化输出内容中包含加入新的控制平面的命令、和工作节点一致的参数--toke和--discovery-token-ca-cert-hash,以及--experimental-control-plane及--certificate-key两个参数,用于获取和使用前面生成的Secret。

如果想要部署外置etcd集群:(感兴趣可以自行搭建一下哦)

   外置etcd的方案与堆叠方案差异不大,进行如下设置即可。
(1)需要为kubeadm设置一组高可用的etcd集群。
(2)将访问etcd所需的证书复制到控制平面所在的服务器上。
(3)在创建kubeadm-config.yaml时需要加入etcd的访问信息。

apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: stable
controlPlaneEndPoint: "LOAD_BALANCER_DNS:LOAD_BLANCER_PORT"
etcd:
  external:
     endpoints:
     - https://etcd_0_ip:2379
     - https://etcd_1_ip:2379
     - https://etcd_2_ip:2379
     caFile: /etc/kubernetes/pki/etcd/ca.crt
     cartFile: /etc/kubernetes/pki/apiserver-etcd-client.crt
     keyFile: /etc/kubernetes/pki/apiserver-etcd-client.key

简单来说,将etcd所需的证书文件以配置文件的方式指派给控制平面即可。

 

     用kubeadm部署高可用Kubernetes集群的过程。在完成控制平面的部署之后,就可以在其中加入工作节点了。
这是一个非常简化的过程,HAProxy成为新的单点,可能导致整体发生故障,因此在实际工作中需要根据生产环境的具体情况,换用硬件负载均衡器方案,或者使用软件进行VIP、DNS等相关高可用保障,从而消除对单一HAProxy的依赖。

 

 

 

小结:  

           本节内容你掌握了吗?集群你搭建出来了吗?

          不懂的记得在下方留言~多多关注。

 

 

 

 

 

 

 

 

 

 

 

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐