關於Kubernetes實驗及線上環境安裝部署

內容

  • 實踐經驗總結
  • 部署記錄
    • Kubernetes線上環境安裝
    • Kubernetes實驗環境安裝

實踐經驗總結

  • Rancher是一個實用的多k8s集羣管理工具, 可以直接用Rancher來安裝集羣, 但是會引起一些潛在問題,如k8s集羣control panel證書更新等問題,因此安裝首選 kubeadm。 使用 kubeadm安裝完畢後, 用Rancher將集羣加入, 統一管理即可。
  • Kubernetes Control Panel 的證書會過期, 使用kubeadm可以更新證書。

部署記錄

以下記錄kubernetes實驗環境及線上環境的使用kubeadm的安裝步驟:

Kubernetes線上環境安裝

由於線上環境已解決國外源及鏡像源的下載問題, 其步驟更精簡:

  • 基礎環境
sudo hostname xxx
sudo vi /etc/hostname
sudo vi /etc/hosts
sudo swapoff -a
  • docker
skipped
  • kubernetes 下載(可指定版本, 如1.14.5
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF

sudo apt-get update

sudo apt-get install -y kubelet kubeadm kubectl  
or
sudo apt-get install -y kubelet=1.14.5-00 kubectl=1.14.5-00 kubeadm=1.14.5-00

sudo apt-mark hold kubelet kubeadm kubectl
  • 運行kubeadm init

較新版本的kubernetes, 如v1.16

sudo kubeadm init --pod-network-cidr=xxx.xxx.xxx.xxx/16 \
     --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" --upload-certs

非最新版本的kubernetes, 如v1.14

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

kubeadm-config.yaml

apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: stable
apiServer:
  certSANs:
  - "xxx.xxx.xxx.xxx"
controlPlaneEndpoint: "xxx.xxx.xxx.xxx:6443"
networking:
  podSubnet: "xxx.xxx.xxx.xxx/16"
  • kubeadm init後續
sudo   mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • kubeadm join

    • 對於Control Panel, kubeadm join後接的xxx.xxx.xxx.xxx:6443可以是lbmaster節點的IP/地址,此值要等於kubeadm-config.yamlcontrolPlaneEndpoin的值(舊版本)或kubeadm init --control-plane-endpoint指定的值(新版本)
    • 對於Node, 若想指定worker node只訪問特定的master,則可以kubeadm join後接的xxx.xxx.xxx.xxx:6443設爲指定master的地址, 而不一定要設爲lvs的地址。
    • 跨多機房的kubernetes的災備配置可由以上兩點延伸。
  • CNIIngress Controller

kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/canal.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
  • Optional: 修改節點角色及使master可調度
kubectl taint node xxx  node-role.kubernetes.io/master:NoSchedule-
kubectl label node xxx node-role.kubernetes.io/worker=worker


Kubernetes實驗環境安裝

  • kubernetes1.3.4
  • ubuntu版本:16.04
  • HA方案:stacked
  • CNICalico 3.6.1
角色 主機 數量
Control Panel 10.0.0.129 \130 \133 3
Node 10.0.0.131-132 2
Haproxy + Keeplived 10.0.0.134-135(vip: 10.0.0.200) 2

各節點/etc/hosts文件如下:

127.0.0.1   localhost
10.0.0.133 	master1
10.0.0.129  master2
10.0.0.130  master3

10.0.0.131  node1
10.0.0.132  node2

10.0.0.135  lb1
10.0.0.134  lb2

10.0.0.200  cluster.kube.com
配置要點
  1. k8s節點安裝 kubeadm, kubelet and kubectl
  • 報錯1:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg |
> apt-key add -
  • 解決:用瀏覽器打開以上url, apt-key.gpg發送到虛擬機, 再運行apt-key add apt-key.gpg

  • 報錯2

cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb
https://apt.kubernetes.io/ kubernetes-xenial main EOF
  • 解決:
    用國內源代替

cat < /etc/apt/sources.list.d/kubernetes.list deb
http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main EOF

  1. 各k8s節點安裝Docker
apt-get purge docker lxc-docker docker-engine docker.io
apt-get install  curl  apt-transport-https ca-certificates software-properties-common
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable"
apt-get update
apt install docker-ce
  1. 安裝和部署Keepalived 和Haproxy
  • keepalived:
apt-get install keepalived  
vi /etc/keepalived/keepalived.conf
  • 主服務器
    vrrp_instance VI_1 {
         	state MASTER    
         interface ens33     
         virtual_router_id 51   
         priority 100          
         advert_int 1         
         }
         virtual_ipaddress {
             10.0.0.200
         }
    }
  • 備服務器
 vrrp_instance VI_1 {
     state BACKUP   
     interface ens33
     virtual_router_id 51
     priority 90    
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass 1111
     }
     virtual_ipaddress {
 	10.0.0.200
     } }

主服務器上運行systemctl networking stop檢測vip是否會遷移到被服務器

  • Haproxy:
 global
        chroot  /var/lib/haproxy
        daemon
        group haproxy
        user haproxy
        log 127.0.0.1:514 local0 warning
        pidfile /var/lib/haproxy.pid
        maxconn 20000
        spread-checks 3
        nbproc 8
 
 defaults
         log     global
         mode    tcp
         retries 3
         option redispatch
 		
 
 listen https-apiserver
         bind 10.0.0.200:6443
         mode tcp
         balance roundrobin 		timeout connect 3s 
         timeout server 15s
         timeout connect 15s
         timeout check 10s
         server apiserver01 10.0.0.133:6443 check port 6443 inter 5000 fall 5
         server apiserver02 10.0.0.129:6443 check port 6443 inter 5000 fall 5
         server apiserver02 10.0.0.130:6443 check port 6443 inter 5000 fall 5
 
 listen http-apiserver
         bind 10.0.0.200:8080
         mode tcp
         balance roundrobin 		timeout connect 3s 
         timeout server 15s
         timeout connect 15s
         timeout check 10s
         server apiserver01 10.0.0.133:8080 check port 8080 inter 5000 fall 5
         server apiserver02 10.0.0.129:8080 check port 8080 inter 5000 fall 5 		server apiserver02 10.0.0.130:8080 check port 8080 inter 5000
 fall 5
 
 listen stats # Define a listen section called "stats"   	bind
 10.0.0.200:9000   	mode http 	timeout connect 3s 
     timeout server 15s
     timeout connect 15s
     timeout check 10s   	stats enable     	stats hide-version     	stats realm Haproxy\ Statistics     	stats uri /haproxy_stats    
 	stats auth xxx:xxxx

可到http://10.0.0.200:9000/haproxy_stats查看haproxy的轉發情況。

4 安裝kubernetes 組件:

按照官網配置,有如下注意要點 :

  • 禁用各節點swap
    swapoff -a  
  • kubeadm 生成第一個master節點
images=(kube-apiserver:v1.13.4  kube-controller-manager:v1.13.4  kube-scheduler:v1.13.4 kube-proxy:v1.13.4 pause:3.1 etcd:3.2.24 coredns:1.2.6)
for imageName in ${images[@]} ; do
  docker pull mirrorgooglecontainers/$imageName
  docker tag mirrorgooglecontainers/$imageName k8s.gcr.io/$imageName
  docker rmi mirrorgooglecontainers/$imageName
done

kubeadm-config.yaml

apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: stable
apiServer:
  certSANs:
  - "cluster.kube.com"
controlPlaneEndpoint: "cluster.kube.com:6443"
networking:
  podSubnet: "192.168.0.0/16"

kubeadm init --config=kubeadm-config.yaml 命令必須加--config=關鍵字 否則如下

kubeadm init kubeadm-config.yaml

該命令會生成默認配置的ClusterConfiguration,導致controlPlaneEndpoint爲空,剩餘的master節點不能成功添加到k8s master集羣中。

  • kubeadm 加入剩餘的master節點
    kubeadm join cluster.kube.com:6443 --token 9crxk1.o5iyfhprrzyan598 --discovery-token-ca-cert-hash sha256:c6967ebf094d33220721cffec0db1cb53028ac7dad0c6cdb609d6ec488cbfe6b --experimental-control-plane
  • kubeadm 加入worker節點
    kubeadm join cluster.kube.com:6443 --token 9crxk1.o5iyfhprrzyan598 --discovery-token-ca-cert-hash sha256:c6967ebf094d33220721cffec0db1cb53028ac7dad0c6cdb609d6ec488cbfe6b 
安裝過程注意項:
  • kubeadm初始化前, 可以運行kubeadm config命令查看各類配置
  • kubeadm 自動化安裝過程中遇到ERROR可使用kubeadm reset重置。
  • kubernates 兩種HA方案中,kubeadm resetexternal etcd方案中etcd的重設不生效。
  • Loadbalancer 的單獨節點配置與LoadbalancerMaster節點重用的方案配置一樣。使用keepalived內置的負載均衡模塊實現效果一樣,但haproxy七層轉發性能更優。
  • kubeadm-config.yaml中注意提前按照選用的CNI要求設置好podSubnet
  • 各節點的主機名不可重複,配置好正確的/etc/hosts及/etc/hostname,否則kubeadm join 會引起錯誤,難以排查。
  • Master節點應在運行kubadm initjoin指令前下載好需要的鏡像,可用kubeadm config images list查看系統鏡像命名和版本。Worker節點只需要pausekube-proxy鏡像。
  • 若選用calico CNI方案,需按照節點數規模選用不同的calico配置,如選用Typha, 確保calico-typha deploymentreplica數大於1, 否則會引起節點路由表更新不同步,路由表異常等現象。
  • 集羣配置成功後,可停用docker服務使得節點NotReady, 觀察路由的更新情況,檢測CNI的功能是否正常。
總體安裝部署路線如下:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章