查看原文
其他

Kubernetes HA 1.9 高可用集群,本地离线部署

泽明 K8S中文社区 2019-12-18

点击上方“K8S中文社区”,选择“置顶公众号”

关键时刻,第一时间送达!




1

Kubernetes介绍


  • k8s 发展速度很快,目前很多大的公司容器集群都基于该项目,如京东,腾讯,滴滴,瓜子二手车,北森等等。



  • kubernetes1.9版本发布2017年12月15日,每是那三个月一个迭代, Workloads API成为稳定版本,这消除了很多潜在用户对于该功能稳定性的担忧。还有一个重大更新,就是测试支持了Windows了,这打开了在kubernetes中运行Windows工作负载的大门。

  • CoreDNS alpha可以使用标准工具来安装CoreDNS

  • kube-proxy的IPVS模式进入beta版,为大型集群提供更好的可扩展性和性能。

  • kube-router的网络插件支持,更方便进行路由控制,发布,和安全策略管理


2

Kubernetes 核心架构




如架构图

  • k8s 高可用2个核心 ==apiserver master== and ==etcd==

  • ==apiserver master==:(需高可用)集群核心,集群API接口、集群各个组件通信的中枢;集群安全控制;

  • ==etcd== :(需高可用)集群的数据中心,用于存放集群的配置以及状态信息,非常重要,如果数据丢失那么集群将无法恢复;因此高可用集群部署首先就是etcd是高可用集群;

  • kube-scheduler:调度器 (内部自选举)集群Pod的调度中心;默认kubeadm安装情况下–leader-elect参数已经设置为true,保证master集群中只有一个kube-scheduler处于活跃状态;

  • kube-controller-manager: 控制器 (内部自选举)集群状态管理器,当集群状态与期望不同时,kcm会努力让集群恢复期望状态,比如:当一个pod死掉,kcm会努力新建一个pod来恢复对应replicas set期望的状态;默认kubeadm安装情况下–leader-elect参数已经设置为true,保证master集群中只有一个kube-controller-manager处于活跃状态;

  • kubelet: agent node注册apiserver

  • kube-proxy: 每个node上一个,负责service vip到endpoint pod的流量转发,老版本主要通过设置iptables规则实现,新版1.9基于kube-proxy-lvs 实现


3

部署示意图



集群HA方案,我们力求简单,使用keepalive 监听一个vip来实现,(当节点不可以后,会有vip漂移的切换时长,取决于我们设置timeout切换时长,测试会有10s空档期,如果对高可用更高要求 可以用lvs或者nginx做 4层lb负载 更佳完美,我们力求简单够用,可接受10s的api不可用)


部署环境:

最近在部署k8s 1.9集群遇到一些问题,整理记录,或许有助需要的朋友。因为kubeadm 简单便捷,所以集群基于该项目部署,目前bete版本不支持HA部署,github说2018年预计发布HA版本,可我们等不及了 呼之欲来。。。




4

环境部署,使用本地离线镜像


环境预初始化

  • Centos Mini安装 每台机器root 

  • 设置机器名

  1. hostnamectl set-hostname etcd-host1

  • 停防火墙

  1. systemctl stop firewalld

  2. systemctl disable firewalld

  3. systemctl disable firewalld

  • 关闭Swap

  1. swapoff -a

  2. sed 's/.*swap.*/#&/' /etc/fstab

  • 关闭防火墙

  1. systemctl disable firewalld && systemctl stop firewalld && systemctl status firewalld

  • 关闭Selinux

  1. setenforce  0

  2. sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux

  3. sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

  4. sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/sysconfig/selinux

  5. sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config

  6. getenforce

  • 增加DNS

  1. echo nameserver 114.114.114.114>>/etc/resolv.conf

  • 设置内核

  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 -p /etc/sysctl.conf

  6. #若问题

  7. 执行sysctl -p 时出现:

  8. sysctl -p

  9. sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory

  10. sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory

  11. 解决方法:

  12. modprobe br_netfilter

  13. ls /proc/sys/net/bridge


配置 keepalived

  • VIP Master 通过控制VIP 来HA高可用(常规方案) 

  • 到目前为止,三个master节点 相互独立运行,互补干扰. kube-apiserver作为核心入口, 可以使用keepalived 实现高可用, kubeadm join暂时不支持负载均衡的方式,所以我们 

  • 安装

  1. yum install -y keepalived

  • 配置keepalived.conf

  1. cat >/etc/keepalived/keepalived.conf  <<EOL

  2. global_defs {

  3.   router_id LVS_k8s

  4. }

  5. vrrp_script CheckK8sMaster {

  6.    script "curl -k https://10.129.6.220:6443"

  7.    interval 3

  8.    timeout 9

  9.    fall 2

  10.    rise 2

  11. }

  12. vrrp_instance VI_1 {

  13.    state MASTER

  14.    interface ens32

  15.    virtual_router_id 61

  16.    # 主节点权重最高 依次减少

  17.    priority 120

  18.    advert_int 1

  19.    #修改为本地IP

  20.    mcast_src_ip 10.129.6.211

  21.    nopreempt

  22.    authentication {

  23.        auth_type PASS

  24.        auth_pass sqP05dQgMSlzrxHj

  25.    }

  26.    unicast_peer {

  27.        #注释掉本地IP

  28.        #10.129.6.211

  29.        10.129.6.212

  30.        10.129.6.213

  31.    }

  32.    virtual_ipaddress {

  33.        10.129.6.220/24

  34.    }

  35.    track_script {

  36.        CheckK8sMaster

  37.    }

  38. }

  39. EOL

  • 启动

  1. systemctl enable keepalived && systemctl restart keepalived

  • 结果

  1. [root@etcd-host1 k8s]# systemctl status keepalived

  2. ● keepalived.service - LVS and VRRP High Availabilitymonitor

  3.   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)

  4.   Active: active (running) since Fri 2018-01-19 10:27:58 CST; 8h ago

  5. Main PID: 1158 (keepalived)

  6.   CGroup: /system.slice/keepalived.service

  7.           ├─1158 /usr/sbin/keepalived -D

  8.           ├─1159 /usr/sbin/keepalived -D

  9.           └─1161 /usr/sbin/keepalived -D

  10. Jan 19 10:28:00 etcd-host1 Keepalived_vrrp[1161]: Sending gratuitous ARP on ens32 for 10.129.6.220

  11. Jan 19 10:28:05 etcd-host1 Keepalived_vrrp[1161]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens32 for 10.129.6.220

  • 依次配置 其他2台从节点master 配置 修改对应节点 ip

  • master01 priority 120

  • master02 priority 110

  • master03 priority 100


Etcd https 集群部署

1、Etcd 环境准备

  1. #机器名称

  2. etcd-host1:10.129.6.211

  3. etcd-host2:10.129.6.212

  4. etcd-host3:10.129.6.213

  5. #部署环境变量

  6. export NODE_NAME=etcd-host3 #当前部署的机器名称(随便定义,只要能区分不同机器即可)

  7. export NODE_IP=10.129.6.213 # 当前部署的机器 IP

  8. export NODE_IPS="10.129.6.211 10.129.6.212 10.129.6.213" # etcd 集群所有机器 IP

  9. # etcd 集群间通信的IP和端口

  10. export ETCD_NODES=etcd-host1=https://10.129.6.211:2380,etcd-host2=https://10.129.6.212:2380,etcd-host3=https://10.129.6.213:2380


2、Etcd 证书创建(我们使用https方式)

创建 CA 证书和秘钥

  • 安装cfssl, CloudFlare 的 PKI 工具集 cfssl 来生成 Certificate Authority (CA) 证书和秘钥文件 

  • 如果不希望将cfssl工具安装到部署主机上,可以在其他的主机上进行该步骤,生成以后将证书拷贝到部署etcd的主机上即可。本教程就是采取这种方法,在一台测试机上执行下面操作。

  1. wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64

  2. chmod +x cfssl_linux-amd64

  3. mv cfssl_linux-amd64 /usr/local/bin/cfssl

  4. wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64

  5. chmod +x cfssljson_linux-amd64

  6. mv cfssljson_linux-amd64 /usr/local/bin/cfssljson

  7. wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64

  8. chmod +x cfssl-certinfo_linux-amd64

  9. mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo


3、生成ETCD的TLS 秘钥和证书

  • 为了保证通信安全,客户端(如 etcdctl) 与 etcd 集群、etcd 集群之间的通信需要使用 TLS 加密,本节创建 etcd TLS 加密所需的证书和私钥。 

  • 创建 CA 配置文件:

  1. cat >  ca-config.json <<EOF

  2. {

  3. "signing": {

  4. "default": {

  5.  "expiry": "8760h"

  6. },

  7. "profiles": {

  8.  "kubernetes": {

  9.    "usages": [

  10.        "signing",

  11.        "key encipherment",

  12.        "server auth",

  13.        "client auth"

  14.    ],

  15.    "expiry": "8760h"

  16.  }

  17. }

  18. }

  19. }

  20. EOF

  • ==ca-config.json==:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile; 

  • ==signing==:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE; 

  • ==server auth==:表示 client 可以用该 CA 对 server 提供的证书进行验证; 

  • ==client auth==:表示 server 可以用该 CA 对 client 提供的证书进行验证;

  1. cat >  ca-csr.json <<EOF

  2. {

  3. "CN": "kubernetes",

  4. "key": {

  5. "algo": "rsa",

  6. "size": 2048

  7. },

  8. "names": [

  9. {

  10.  "C": "CN",

  11.  "ST": "BeiJing",

  12.  "L": "BeiJing",

  13.  "O": "k8s",

  14.  "OU": "System"

  15. }

  16. ]

  17. }

  18. EOF

  • “CN”:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;

  •  “O”:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group); 

  • ==生成 CA 证书和私钥==:

  1. cfssl gencert -initca ca-csr.json | cfssljson -bare ca

  2. ls ca*

==创建 etcd 证书签名请求:==

  1. cat > etcd-csr.json <<EOF

  2. {

  3.  "CN": "etcd",

  4.  "hosts": [

  5.    "127.0.0.1",

  6.    "10.129.6.211",

  7.    "10.129.6.212",

  8.    "10.129.6.213"

  9.  ],

  10.  "key": {

  11.    "algo": "rsa",

  12.    "size": 2048

  13.  },

  14.  "names": [

  15.    {

  16.      "C": "CN",

  17.      "ST": "BeiJing",

  18.      "L": "BeiJing",

  19.      "O": "k8s",

  20.      "OU": "System"

  21.    }

  22.  ]

  23. }

  24. EOF

  • hosts 字段指定授权使用该证书的 etcd 节点 IP; 

  • 每个节点IP 都要在里面 或者 每个机器申请一个对应IP的证书 


4、生成 etcd 证书和私钥:

  1. cfssl gencert -ca=ca.pem \

  2.  -ca-key=ca-key.pem \

  3.  -config=ca-config.json \

  4.  -profile=kubernetes etcd-csr.json | cfssljson -bare etcd

  5. ls etcd*

  6. mkdir -p /etc/etcd/ssl

  7. cp etcd.pem etcd-key.pem  ca.pem /etc/etcd/ssl/

  8. #

  9. #其他node

  10. rm -rf /etc/etcd/ssl/*

  11. scp -r /etc/etcd/ssl root@10.129.6.211:/etc/etcd/

  12. scp -r root@10.129.6.211:/root/k8s/etcd/etcd-v3.3.0-rc.1-linux-amd64.tar.gz /root

将生成好的etcd.pem和etcd-key.pem以及ca.pem三个文件拷贝到目标主机的/etc/etcd/ssl目录下。

 

下载二进制安装文件

到 https://github.com/coreos/etcd/releases 页面下载最新版本的二进制文件:

  1. wget http://github.com/coreos/etcd/releases/download/v3.1.10/etcd-v3.1.10-linux-amd64.tar.gz

  2. tar -xvf etcd-v3.1.10-linux-amd64.tar.gz

  3. mv etcd-v3.1.10-linux-amd64/etcd* /usr/local/bin


创建 etcd 的 systemd unit 文件

  1. mkdir -p /var/lib/etcd  # 必须先创建工作目录

  2. cat > etcd.service <<EOF

  3. [Unit]

  4. Description=Etcd Server

  5. After=network.target

  6. After=network-online.target

  7. Wants=network-online.target

  8. Documentation=https://github.com/coreos

  9. [Service]

  10. Type=notify

  11. WorkingDirectory=/var/lib/etcd/

  12. ExecStart=/usr/local/bin/etcd \\

  13.  --name=${NODE_NAME} \\

  14.  --cert-file=/etc/etcd/ssl/etcd.pem \\

  15.  --key-file=/etc/etcd/ssl/etcd-key.pem \\

  16.  --peer-cert-file=/etc/etcd/ssl/etcd.pem \\

  17.  --peer-key-file=/etc/etcd/ssl/etcd-key.pem \\

  18.  --trusted-ca-file=/etc/etcd/ssl/ca.pem \\

  19.  --peer-trusted-ca-file=/etc/etcd/ssl/ca.pem \\

  20.  --initial-advertise-peer-urls=https://${NODE_IP}:2380 \\

  21.  --listen-peer-urls=https://${NODE_IP}:2380 \\

  22.  --listen-client-urls=https://${NODE_IP}:2379,http://127.0.0.1:2379 \\

  23.  --advertise-client-urls=https://${NODE_IP}:2379 \\

  24.  --initial-cluster-token=etcd-cluster-0 \\

  25.  --initial-cluster=${ETCD_NODES} \\

  26.  --initial-cluster-state=new \\

  27.  --data-dir=/var/lib/etcd

  28. Restart=on-failure

  29. RestartSec=5

  30. LimitNOFILE=65536

  31. [Install]

  32. WantedBy=multi-user.target

  • 指定 etcd 的工作目录和数据目录为 /var/lib/etcd,需在启动服务前创建这个目录; 

  • 为了保证通信安全,需要指定 etcd 的公私钥(cert-file和key-file)、Peers 通信的公私钥和 CA 证书(peer-cert-file、peer-key-file、peer-trusted-ca-file)、客户端的CA证书(trusted-ca-file); 

  • –initial-cluster-state 值为 new 时,–name 的参数值必须位于 –initial-cluster 列表中; 


启动 etcd 服务

  1. mv etcd.service /etc/systemd/system/

  2. systemctl daemon-reload

  3. systemctl enable etcd

  4. systemctl start etcd

  5. systemctl status etcd


验证服务

  1. etcdctl \

  2.  --endpoints=https://${NODE_IP}:2379  \

  3.  --ca-file=/etc/etcd/ssl/ca.pem \

  4.  --cert-file=/etc/etcd/ssl/etcd.pem \

  5.  --key-file=/etc/etcd/ssl/etcd-key.pem \

  6.  cluster-health

预期结果:

  1. [root@node02 ~]# etcdctl   --endpoints=https://${NODE_IP}:2379    --ca-file=/etc/etcd/ssl/ca.pem   --cert-file=/etc/etcd/ssl/etcd.pem   --key-file=/etc/etcd/ssl/etcd-key.pem   cluster-health

  2. member 18699a64c36a7e7b is healthy: got healthy result from https://10.129.6.213:2379

  3. member 5dbd6a0b2678c36d is healthy: got healthy result from https://10.129.6.211:2379

  4. member 6b1bf02f85a9e68f is healthy: got healthy result from https://10.129.6.212:2379

  5. cluster is healthy

若有失败 或 重新配置

  1. systemctl stop etcd

  2. rm -Rf /var/lib/etcd

  3. rm -Rf /var/lib/etcd-cluster

  4. mkdir -p /var/lib/etcd

  5. systemctl start etcd


k8s 安装


1、提取k8s rpm 包

  • 默认由于某某出海问题 

  • 我们离线导入下rpm 仓库 

  • 安装官方YUM 仓库

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

  2. [kubernetes]

  3. name=Kubernetes

  4. baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64

  5. enabled=1

  6. gpgcheck=1

  7. repo_gpgcheck=0

  8. gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg

  9.       https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

  10. EOF


2、安装kubeadm kubectl cni

下载镜像(自行搬梯子先获取rpm)

  1. mkdir -p  /root/k8s/rpm

  2. cd /root/k8s/rpm

  3. #安装同步工具

  4. yum install -y yum-utils

  5. #同步本地镜像

  6. yumdownloader kubelet kubeadm kubectl kubernetes-cni docker

  7. scp root@10.129.6.224:/root/k8s/rpm/*  /root/k8s/rpm

离线安装

  1. mkdir -p  /root/k8s/rpm

  2. scp root@10.129.6.211:/root/k8s/rpm/*  /root/k8s/rpm

  3. yum install  /root/k8s/rpm/*.rpm -y

启动k8s

  1. #restart

  2. systemctl enable docker && systemctl restart docker

  3. systemctl enable kubelet && systemctl restart kubelet


3、镜像获取方法

加速器获取 gcr.io k8s镜像 ,导出,导入镜像 或 上传本地仓库

  1. #国内可以使用daocloud加速器下载相关镜像,然后通过docker save、docker load把本地下载的镜像放到kubernetes集群的所在机器上,daocloud加速器链接如下:

  2. https://www.daocloud.io/mirror#accelerator-doc

  3. #pull 获取

  4. docker pull gcr.io/google_containers/kube-proxy-amd64:v1.9.0

  5. #导出

  6. mkdir -p docker-images

  7. docker save -o docker-images/kube-proxy-amd64  gcr.io/google_containers/kube-proxy-amd64:v1.9.0

  8. #导入

  9. docker load -i /root/kubeadm-ha/docker-images/kube-proxy-amd64

代理或vpn获取 gcr.io k8s镜 ,导出,导入镜像 或 上传本地仓库

  1. 自谋生路,天机屋漏


4、kubelet 指定本地镜像

kubelet 修改 配置以使用本地自定义pause镜像 devhub.beisencorp.com/google_containers/pause-amd64:3.0 替换你的环境镜像

  1. cat > /etc/systemd/system/kubelet.service.d/20-pod-infra-image.conf <<EOF

  2. [Service]

  3. Environment="KUBELET_EXTRA_ARGS=--pod-infra-container-image=devhub.beisencorp.com/google_containers/pause-amd64:3.0"

  4. EOF

  5. systemctl daemon-reload

  6. systemctl restart kubelet


Kubeadm Init 初始化

  • 我们使用config 模板方式来初始化集群,便于我们指定etcd 集群

  • devhub.beisencorp.com 使我们的 测试镜像仓库 可以改成自己或者手动导入每个机器镜像

  1. cat <<EOF > config.yaml

  2. apiVersion: kubeadm.k8s.io/v1alpha1

  3. kind: MasterConfiguration

  4. etcd:

  5.  endpoints:

  6.  - https://10.129.6.211:2379

  7.  - https://10.129.6.212:2379

  8.  - https://10.129.6.213:2379

  9.  caFile: /etc/etcd/ssl/ca.pem

  10.  certFile: /etc/etcd/ssl/etcd.pem

  11.  keyFile: /etc/etcd/ssl/etcd-key.pem

  12.  dataDir: /var/lib/etcd

  13. networking:

  14.  podSubnet: 10.244.0.0/16

  15. kubernetesVersion: 1.9.0

  16. api:

  17.  advertiseAddress: "10.129.6.220"

  18. token: "b99a00.a144ef80536d4344"

  19. tokenTTL: "0s"

  20. apiServerCertSANs:

  21. - etcd-host1

  22. - etcd-host2

  23. - etcd-host3

  24. - 10.129.6.211

  25. - 10.129.6.212

  26. - 10.129.6.213

  27. - 10.129.6.220

  28. featureGates:

  29.  CoreDNS: true

  30. imageRepository: "devhub.beisencorp.com/google_containers"

  31. EOF

初始化集群

  1. kubeadm init --config config.yaml

结果

  1. To start using your cluster, you need to run the following as a regular user:

  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. as root:

  6.  kubeadm join --token b99a00.a144ef80536d4344 10.129.6.220:6443 --discovery-token-ca-cert-hash sha256:ebc2f64e9bcb14639f26db90288b988c90efc43828829c557b6b66bbe6d68dfa

查看node

  1. [root@etcd-host1 k8s]# kubectl get node

  2. NAME         STATUS    ROLES     AGE       VERSION

  3. etcd-host1   noReady     master    5h        v1.9.0

  4. [root@etcd-host1 k8s]# kubectl get cs

  5. NAME                 STATUS    MESSAGE              ERROR

  6. scheduler            Healthy   ok                  

  7. controller-manager   Healthy   ok                  

  8. etcd-1               Healthy   {"health": "true"}  

  9. etcd-2               Healthy   {"health": "true"}  

  10. etcd-0               Healthy   {"health": "true"}  

问题记录

  1. 如果使用kubeadm初始化集群,启动过程可能会卡在以下位置,那么可能是因为cgroup-driver参数与docker的不一致引起

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

  3. journalctl -t kubelet -S '2017-06-08'查看日志,发现如下错误

  4. error: failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: "systemd"

  5. 需要修改KUBELET_CGROUP_ARGS=--cgroup-driver=systemd为KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs

  6. vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

  7. #Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"

  8. Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs"

  9. systemctl daemon-reload && systemctl restart kubelet


安装网络组件 podnetwork

  • 我们选用kube-router

  1. wget https://github.com/cloudnativelabs/kube-router/blob/master/daemonset/kubeadm-kuberouter.yaml

  2. kubectl apply -f kubeadm-kuberouter.yaml

  • 结果

  1. [root@etcd-host1 k8s]# kubectl get po --all-namespaces

  2. NAMESPACE     NAME                                 READY     STATUS    RESTARTS   AGE

  3. kube-system   coredns-546545bc84-zc5dx             1/1       Running   0          6h

  4. kube-system   kube-apiserver-etcd-host1            1/1       Running   0          6h

  5. kube-system   kube-controller-manager-etcd-host1   1/1       Running   0          6h

  6. kube-system   kube-proxy-pfj7x                     1/1       Running   0          6h

  7. kube-system   kube-router-858b7                    1/1       Running   0          37m

  8. kube-system   kube-scheduler-etcd-host1            1/1       Running   0          6h

  9. [root@etcd-host1 k8s]#


部署其他Master 节点

  • 拷贝master01 配置 master02 master03

  1. #拷贝pki 证书

  2. mkdir -p /etc/kubernetes/pki

  3. scp -r root@10.129.6.211:/etc/kubernetes/pki /etc/kubernetes

  4. #拷贝初始化配置

  5. scp -r root@10.129.6.211://root/k8s/config.yaml /etc/kubernetes/config.yaml

  • 初始化 master02 master03

  1. #初始化

  2. kubeadm init --config /etc/kubernetes/config.yaml


部署成功 验证结果

为了测试我们把master 设置为 可部署role

默认情况下,为了保证master的安全,master是不会被调度到app的。你可以取消这个限制通过输入:

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

录制终端验证 结果 

视频地址:https://asciinema.org/a/ChsHM9EYyabuoB3xcrHtBfdR2 

验证

  1. [zeming@etcd-host1 k8s]$ kubectl get node

  2. NAME         STATUS    ROLES     AGE       VERSION

  3. etcd-host1   Ready     master    6h        v1.9.0

  4. etcd-host2   Ready     master    5m        v1.9.0

  5. etcd-host3   Ready     master    49s       v1.9.0

  6. [zeming@etcd-host1 k8s]$ kubectl get po --all-namespaces

  7. NAMESPACE     NAME                                 READY     STATUS    RESTARTS   AGE

  8. default       nginx01-d87b4fd74-2445l              1/1       Running   0          1h

  9. default       nginx01-d87b4fd74-7966r              1/1       Running   0          1h

  10. default       nginx01-d87b4fd74-rcbhw              1/1       Running   0          1h

  11. kube-system   coredns-546545bc84-zc5dx             1/1       Running   0          3d

  12. kube-system   kube-apiserver-etcd-host1            1/1       Running   0          3d

  13. kube-system   kube-apiserver-etcd-host2            1/1       Running   0          3d

  14. kube-system   kube-apiserver-etcd-host3            1/1       Running   0          3d

  15. kube-system   kube-controller-manager-etcd-host1   1/1       Running   0          3d

  16. kube-system   kube-controller-manager-etcd-host2   1/1       Running   0          3d

  17. kube-system   kube-controller-manager-etcd-host3   1/1       Running   0          3d

  18. kube-system   kube-proxy-gk95d                     1/1       Running   0          3d

  19. kube-system   kube-proxy-mrzbq                     1/1       Running   0          3d

  20. kube-system   kube-proxy-pfj7x                     1/1       Running   0          3d

  21. kube-system   kube-router-bbgpq                    1/1       Running   0          3h

  22. kube-system   kube-router-v2jbh                    1/1       Running   0          3h

  23. kube-system   kube-router-w4cbb                    1/1       Running   0          3h

  24. kube-system   kube-scheduler-etcd-host1            1/1       Running   0          3d

  25. kube-system   kube-scheduler-etcd-host2            1/1       Running   0          3d

  26. kube-system   kube-scheduler-etcd-host3            1/1       Running   0          3d

  27. [zeming@etcd-host1 k8s]$


主备测试

  • 关闭 主节点 master01 观察切换到 master02 机器 

  • master03 一直不管获取node信息 测试高可用

  1. while true; do  sleep 1; kubectl get node;date; done

观察主备VIP切换过程

  1. #观察当Master01主节点关闭后,被节点VIP状态  BACKUP  切换到 MASTER

  2. [root@etcd-host2 net.d]# systemctl status keepalived

  3. ● keepalived.service - LVS and VRRP High Availability Monitor

  4.   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)

  5.   Active: active (running) since Tue 2018-01-22 13:54:17 CST; 21s ago

  6. Jan 22 13:54:17 etcd-host2 Keepalived_vrrp[15908]: VRRP_Instance(VI_1) Transition to MASTER STATE

  7. Jan 22 13:54:17 etcd-host2 Keepalived_vrrp[15908]: VRRP_Instance(VI_1) Received advert with higher priority 120, ours 110

  8. Jan 22 13:54:17 etcd-host2 Keepalived_vrrp[15908]: VRRP_Instance(VI_1) Entering BACKUP STATE

  9. #切换到 MASTER

  10. [root@etcd-host2 net.d]# systemctl status keepalived

  11. ● keepalived.service - LVS and VRRP High Availability Monitor

  12.   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)

  13.   Active: active (running) since Tue 2018-01-22 13:54:17 CST; 4min 6s ago

  14. Jan 22 14:03:02 etcd-host2 Keepalived_vrrp[15908]: VRRP_Instance(VI_1) Transition to MASTER STATE

  15. Jan 22 14:03:03 etcd-host2 Keepalived_vrrp[15908]: VRRP_Instance(VI_1) Entering MASTER STATE

  16. Jan 22 14:03:03 etcd-host2 Keepalived_vrrp[15908]: VRRP_Instance(VI_1) setting protocol VIPs.

  17. Jan 22 14:03:03 etcd-host2 Keepalived_vrrp[15908]: Sending gratuitous ARP on ens32 for 10.129.6.220

验证集群高可用

  1. #观察 master01 关机后状态变成NotReady

  2. [root@etcd-host3 ~]# while true; do  sleep 1; kubectl get node;date; done

  3. Tue Jan 22 14:03:16 CST 2018

  4. NAME         STATUS    ROLES     AGE       VERSION

  5. etcd-host1   Ready     master    19m       v1.9.0

  6. etcd-host2   Ready     master    3d        v1.9.0

  7. etcd-host3   Ready     master    3d        v1.9.0

  8. Tue Jan 22 14:03:17 CST 2018

  9. NAME         STATUS     ROLES     AGE       VERSION

  10. etcd-host1   NotReady   master    19m       v1.9.0

  11. etcd-host2   Ready      master    3d        v1.9.0

  12. etcd-host3   Ready      master    3d        v1.9.0


参观文档

k8s 官方文档

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/

kubeadm ha 项目文档

https://github.com/indiketa/kubeadm-ha

kubespray 之前的kargo ansible项目

https://github.com/kubernetes-incubator/kubespray/blob/master/docs/ha-mode.md

若转载请注明出处 By Zeming 若有描述不清楚 请留言指出

http://xuzeming.top/2018/01/19/K8s-1-9%E5%AE%9E%E8%B7%B5-Kubeadm-HA-1-9-%E9%AB%98%E5%8F%AF%E7%94%A8-%E9%9B%86%E7%BE%A4-%E6%9C%AC%E5%9C%B0%E7%A6%BB%E7%BA%BF%E9%83%A8%E7%BD%B2/



对Kubernetes、Docker、容器、微服务等云计算感兴趣的欢迎关注我们;

关注上方二维码: K8S中文社区,回复“ 加群

加K8S技术交流微信群


推荐阅读

极简教程,创建 Kubernetes1.9 集群

IBM微讲堂出品 | Kubernetes 内功修炼实战

说说Kubernetes是怎么来的,又是怎么没的

漫画:小黄人学 Kubernetes Service

梁胜博士:写给程序员的话

40张技术图谱,架构师阶梯 (附高清下载)

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存