內容
- 實踐經驗總結
- 部署記錄
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
可以是lb
或master
節點的IP/地址
,此值要等於kubeadm-config.yaml
的controlPlaneEndpoin
的值(舊版本)或kubeadm init --control-plane-endpoint
指定的值(新版本) - 對於
Node
, 若想指定worker node
只訪問特定的master
,則可以kubeadm join
後接的xxx.xxx.xxx.xxx:6443
設爲指定master
的地址, 而不一定要設爲lvs
的地址。 - 跨多機房的
kubernetes
的災備配置可由以上兩點延伸。
- 對於
-
CNI
和Ingress 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
實驗環境安裝
kubernetes
:1.3.4
ubuntu版本
:16.04HA
方案:stackedCNI
:Calico 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:
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
- 各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
- 安裝和部署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 reset
對external etcd
方案中etcd
的重設不生效。Loadbalancer
的單獨節點配置與Loadbalancer
和Master
節點重用的方案配置一樣。使用keepalived
內置的負載均衡模塊實現效果一樣,但haproxy七層轉發性能更優。kubeadm-config.yaml
中注意提前按照選用的CNI要求設置好podSubnet
。- 各節點的主機名不可重複,配置好正確的
/etc/hosts及/etc/hostname
,否則kubeadm join
會引起錯誤,難以排查。 - 各
Master
節點應在運行kubadm init
和join
指令前下載好需要的鏡像,可用kubeadm config images list
查看系統鏡像命名和版本。Worker
節點只需要pause
和kube-proxy
鏡像。 - 若選用
calico CNI
方案,需按照節點數規模選用不同的calico配置,如選用Typha, 確保calico-typha deployment
的replica
數大於1, 否則會引起節點路由表更新不同步,路由表異常等現象。 - 集羣配置成功後,可停用
docker
服務使得節點NotReady
, 觀察路由的更新情況,檢測CNI的功能是否正常。