master node: 數量 1, 系統 ubuntu 16.04_amd64
worker node: 數量 1, 系統 ubuntu 16.04_amd64
kubernetes 版本: v1.10.07node
執行docker.shlinux
sudo -E bash docker.sh
如下操做在master node 上執行:git
執行selinux_ipv6.sh,關閉selinux、開啓ipv6:github
#!/bin/sh # 關閉 selinux sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config setenforce 0 # 開啓ipv6 cat <<EOF > /etc/sysctl.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF modprobe br_netfilter sysctl -p
執行腳本:docker
sudo bash selinux_ipv6.sh
下載k8s.io鏡像
如上表所示的鏡像都是咱們所須要的,可是因爲網絡環境的限制致使咱們沒法直接從gcr.io的源地址拉去鏡像,只能在本地事先下載好所須要的鏡像,執行k8s_v1.10_images_download.sh腳本便可:shell
sudo bash k8s_v1.10_images_download.sh
安裝kubeadm
首先,在source.list.d中添加阿里的kubernetes源:json
# 添加源 cat <<EOF > /etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF # 安裝源證書 curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - # 更新源 apt-get update
注意,須要在root帳戶下執行以上命令。ubuntu
而後安裝kubeadm相關組件:segmentfault
apt-get install -y kubeadm=1.10.7-00
初始化 kubernetes 服務api
kubeadm init --kubernetes-version=v1.10.7 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=0.0.0.0 --ignore-preflight-errors='Swap'
顯示結果以下:
Your Kubernetes master has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ You can now join any number of machines by running the following on each node as root: kubeadm join 192.168.1.185:6443 --token ow8gkw.yltjigl52r7q3jlq --discovery-token-ca-cert-hash sha256:aa2e50c49a35bcf65edfcf6081159adbf27d7d5a09707d584636a9ab4e1e7b3c
按照上面顯示的指示,copy kube-config:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看當前節點狀態:
kubectl get nodes
顯示結果以下:
NAME STATUS ROLES AGE VERSION whty0-to-be-filled-by-o-e-m NotReady master 2h v1.10.7
之因此沒有處於Ready狀態,是由於咱們尚未配置 可使得kubernetes節點之間互相通訊的網絡插件.
經過kubeadm上面顯示的token就能夠,引導其餘節點加入到k8s集羣:
關閉selinux、開啓ipv6
參照上一節
下載k8s.io鏡像
參照上一節
安裝kubeadm 組件
參照上一節
引導worker node 加入集羣:
sudo kubeadm join 192.168.1.185:6443 --token ow8gkw.yltjigl52r7q3jlq --discovery-token-ca-cert-hash sha256:aa2e50c49a35bcf65edfcf6081159adbf27d7d5a09707d584636a9ab4e1e7b3c --ignore-preflight-errors='swap' --ignore-preflight-errors='cri'
這裏所傳入的token就是在master節點上初始化時最後顯示的token,須要注意的是token是具備有效期的,在有效期事後須要從新發放token,最終顯示結果以下:
[preflight] Running pre-flight checks. [WARNING SystemVerification]: docker version is greater than the most recently validated version. Docker version: 18.06.1-ce. Max validated version: 17.03 [WARNING CRI]: unable to check if the container runtime at "/var/run/dockershim.sock" is running: exit status 1 [WARNING Swap]: running with swap on is not supported. Please disable swap [discovery] Trying to connect to API Server "192.168.1.185:6443" [discovery] Created cluster-info discovery client, requesting info from "https://192.168.1.185:6443" [discovery] Requesting info from "https://192.168.1.185:6443" again to validate TLS against the pinned public key [discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "192.168.1.185:6443" [discovery] Successfully established connection with API Server "192.168.1.185:6443"
想要在集羣中部署的容器能夠跨節點互相通訊則須要安裝網絡插件,kubernetes的網絡插件有不少種,咱們這裏只說兩種 calico 和 flannel。
咱們這裏經過安裝網絡插件容器的方式來部署, 所使用的是cni網絡插件。主要有兩個配置文件:rabc-kdd.yaml用來配置權限,而calico.yaml用於配置calico插件:
kubectl apply -f ./rbac-kdd.yaml kubectl apply -f ./calico.yaml
這裏須要提醒你們的是,咱們在calico.yaml中有以下配置:
# Auto-detect the BGP IP address. # value: "autodetect" - name: IP value: "autodetect" - name: IP_AUTODETECTION_METHOD value: interface=enp1s.*,wlx.* - name: FELIX_HEALTHENABLED value: "true"
IP:autodetect 指定了cni插件自動去識別主機的地址,IP_AUTODETECTION_METHOD:interface=enp1s.*,wlx.* 則指定了主機的物理網卡名稱(enp1s是有線網卡的前綴、wlx是無線網卡前綴),支持通配符的方式來匹配,因此咱們在安裝的時候須要注意本地物理網卡的名稱本身進行適當的修改。
此外還有以下配置用來劃定pod的IP地址範圍:
- name: CALICO_IPV4POOL_CIDR value: "10.244.0.0/16"
注意:要與 kubeadm init 時指定的ip範圍一致。
部署成功後咱們能夠查看當前在線節點:
NAME STATUS ROLES AGE VERSION whty0-to-be-filled-by-o-e-m Ready master 2h v1.10.7 whtyhust-to-be-filled-by-o-e-m Ready <none> 1h v1.10.7
與calico相同,咱們flannel也使用一樣的方式來部署,只要按照如下步驟執行便可:
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f kube-flannel.yml
注意: 須要kubernetes的版本在1.7以上才行,此外在 flannel.yml中有以下配置:
net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan" } }
此處Network的地址範圍要與 kubeadm init 時指定的範圍一致。
在master node 上執行
kubectl taint nodes --all node-role.kubernetes.io/master-
顯示結果以下:
taint "node-role.kubernetes.io/master:" not found taint "node-role.kubernetes.io/master:" not found
執行以上命令後,在部署 k8s資源時 master node會像 worker node同樣被對待,不然默認不會在master節點上部署 k8s 資源
在咱們安裝了kubernetes集羣后可能過一段時間須要添加一個節點,當你使用最初的token去加入節點時發現token失效了,這是由於這個token是有時間限制的。只有從新的生成token才能把節點加入,token的生成過程以下:
建立token
kubeadm token create
顯示結果以下:
[kubeadm] WARNING: starting in 1.8, tokens expire after 24 hours by default (if you require a non-expiring token use --ttl 0) aa78f6.8b4cafc8ed26c34f
此處的aa78f6.8b4cafc8ed26c34f 就是新生成的token。
獲取api server ca 證書的hash
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
顯示結果以下:
0fd95a9bc67a7bf0ef42da968a0d55d92e52898ec37c971bd77ee501d845b538
加入新節點:
kubeadm join --token aa78f6.8b4cafc8ed26c34f --discovery-token-ca-cert-hash sha256:0fd95a9bc67a7bf0ef42da968a0d55d92e52898ec37c971bd77ee501d845b538 172.16.6.79:6443
不一樣的網絡插件實現的機制不一致,其中flannel+vxlan的方式比較流行,咱們須要後續的研究和比較,哪一種類型的插件更加高效。好比在做者實際的工做過程當中,遇到過如下問題:
使用kubernetes搭建fabric-kafka分佈式服務,在使用calcio時kafka服務的zookeeper節點之間頻繁連接超時,即便修改了超時等待時間仍然沒法解決問題,但在一樣的環境中,使用了flannel+vxlan插件以後zookeeper之間能夠穩定的連接。
此外,當使用flannel+vxlan後有可能在建立pod的過程當中遇到以下問題:
network: failed to set bridge addr: \"cni0\" already has an IP address different from 10.244.1.1/24"
這是由於在反覆安裝kubernetes過程當中cni的歷史數據並無清除乾淨,這個問題在後續版本中已經被修復,但在1.10.7版本中仍然存在這個問題,能夠經過執行如下命令來完全清除cni歷史數據:
#!/bin/sh kubeadm reset systemctl stop kubelet systemctl stop docker rm -rf /var/lib/cni/ rm -rf /var/lib/kubelet/* rm -rf /etc/cni/ ifconfig cni0 down ifconfig flannel.1 down ifconfig docker0 down ip link delete cni0 ip link delete flannel.1 systemctl start kubelet systemctl start docker