Kubernetes安裝,遇到的問題,很大部分是無法獲取官方依賴鏡像造成。可以選擇合適的方式避開鏡像獲取失敗問題。
比如:
1. 服務器http proxy科學上網【本文使用】
2. 服務器使用的網關可以科學上網
3. 將Kubernetes安裝涉及到的docker鏡像提前下載至私庫(比如docker hub), 並修改安裝中涉及到的yaml文件,將其中鏡像修改為私庫中的鏡像名稱。
上述方案3,本人有嘗試過使用內網的Docker Registry私庫,使用IP+端口Http傳輸鏡像,kubernetes安裝過程中出現Https握手失敗的提示,導致安裝失敗。
環境
本次安裝使用2台VMware虛擬機,Centos7 64位操作系統,安裝Kubernetes版本為1.11.1。對於Kubernetes可以選擇差不多的版本,比如1.10.x。
另外,本文涉及的操作用戶是root賬戶。
本次部署為一個master節點,一個node節點。按需可以添加多個node節點,方法一樣。
IP地址 | HostName | 操作系統 | 備注 |
172.16.78.243 | k8s-master | Centos7 64位 | k8s master節點 |
172.16.78.244 | k8s-node1 | Centos7 64位 | k8s node 節點 |
服務器環境初始化
1. 配置服務器科學上網
將ssinit,sson,ssoff 寫入bashrc:
a. 修改~/.bashrc
b. 添加以下內容:
alias ssinit='nohup sslocal -c /etc/shadowsocks.json &>> /var/log/sslocal.log &' alias sson='export http_proxy=http://127.0.0.1:8118 && export https_proxy=http://127.0.0.1:8118 && systemctl start privoxy' alias ssoff='unset http_proxy && unset https_proxy && systemctl stop privoxy && pkill sslocal'
c. 修改生效:
source ~/.bashrc
配置過后,執行 ssinit,sson命令,curl www.google.com 確認是否訪問正常。然后ssoff關閉代理。
2. 關閉selinux
#修改/etc/selinux/config,修改SELINUX為disabled vim /etc/selinux/config SELINUX=disabled #執行 setenforce 0 #重啟 reboot
3. 修改各服務器上的/etc/hosts文件
添加各服務器ip與主機名關系:
172.16.78.243 k8s-master 172.16.78.244 k8s-node1
重啟網絡服務
service network restart
4. 各服務器時間同步
#安裝ntpdate yum install -y ntpdate #同步北京時間 ntpdate -u cn.pool.ntp.org
Master節點部署
1. 關閉交換空間
a. free -h 查看是否有swap內存
b. swapoff -a 永久關閉交換空間
c. 注釋/etc/fstab中swap條目
d. 重啟服務器
2. mac地址和product_uuid要求在kubernetes集群中唯一
ifconfig sudo cat /sys/class/dmi/id/product_uuid
3. 內網環境,關閉防火牆,或者確保涉及到的端口開放
4. 安裝docker
yum install -y docker systemctl enable docker && systemctl start docker
如果啟動docker出現:

5. docker設置http代理【需要時設置】
該步驟,只在需要docker科學上網拉取鏡像時使用。
a. 服務已啟動代理(ssinit,sson)
b. 配置/etc/sysconfi/docker,添加代理地址
c. systemctl restart docker
備注:關閉docker http代理時,注釋/etc/sysconfi/docker中的代理地址,systemctl daemon-reload,systemctl restart docker。
6. 安裝 kubelet,kubeadm
本步驟涉及到的命令,務必使用Kubernetes官方文檔中的命令,因為官網可能會更新。
# 務必使用官方文檔中的命令進行操作,此處僅供參考 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpghttps://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF setenforce 0 yum install -y kubelet kubeadm kubectl systemctl enable kubelet && systemctl start kubelet
7. Master節點配置dcker cgrouop與kubelet一致
a. 查看docker cgroup
docker info | grep -i cgroup 查看docker的cgroup,本文中為systemd
b. 修改kubelet配置

c. 重啟kubelet
systemctl daemon-reload
systemctl restart kubelet
8. 修改路由規則
# 務必使用官方文檔中的命令進行操作,此處僅供參考 cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system
systemctl daemon-reload
systemctl restart kubelet
9. 拉取需要用到的鏡像
a. 使用kubeadm config images list 列出需要的鏡像
k8s.gcr.io/kube-apiserver-amd64:v1.11.1 k8s.gcr.io/kube-controller-manager-amd64:v1.11.1 k8s.gcr.io/kube-scheduler-amd64:v1.11.1 k8s.gcr.io/kube-proxy-amd64:v1.11.1 k8s.gcr.io/pause:3.1 k8s.gcr.io/etcd-amd64:3.2.18 k8s.gcr.io/coredns:1.1.3
b. 參考步驟docker設置http代理
c. docker pull 依次拉取a中的鏡像
10 kubeadm init
需要關閉服務器http代理,關閉docker http代理
kubeadm init --pod-network-cidr=192.168.0.0/16 --kubernetes-version=v1.11.1 --apiserver-advertise-address=172.16.78.243
--apiserver-advertise-address為master節點地址,--pod-network-cidr參數是網絡插件Calico需要用到的 配置。
11. 根據頁面提示操作
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
記錄node節點加入集群命令,后期node節點安裝需要使用,命令中的token 24小時后失效。
kubeadm join 172.16.78.243:6443 --token sm4yzq.r7mwo1isrnrw2vyh --discovery-token-ca-cert-hash sha256:55989ef0da53df8ba12f9e9edef0474b351bd72b80c60dbc5eadf4ef5890c0b9
12. 安裝Calico網絡插件
a. 安裝單節點Calico & etcd
kubectl apply -f \ https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubeadm/1.7/calico.yaml
b. 查看容器運行正常
watch kubectl get pods --all-namespaces
輸出類似:
NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-etcd-x2482 1/1 Running 0 2m kube-system calico-kube-controllers-6ff88bf6d4-tgtzb 1/1 Running 0 2m kube-system calico-node-24h85 2/2 Running 0 2m kube-system etcd-jbaker-virtualbox 1/1 Running 0 6m kube-system kube-apiserver-jbaker-virtualbox 1/1 Running 0 6m kube-system kube-controller-manager-jbaker-virtualbox 1/1 Running 0 6m kube-system kube-dns-545bc4bfd4-67qqp 3/3 Running 0 5m kube-system kube-proxy-8fzp2 1/1 Running 0 5m kube-system kube-scheduler-jbaker-virtualbox 1/1 Running 0 5m
CTRL + C 推出watch命令
c. 關閉Master節點的taints
kubectl taint nodes --all node-role.kubernetes.io/master-
輸出類似:
node "<your-hostname>" untainted
d. 確認運行狀態
kubectl get nodes -o wide
輸出類似:
NAME STATUS ROLES AGE VERSION EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME <your-hostname> Ready master 1h v1.8.x <none> Ubuntu 16.04.3 LTS 4.10.0-28-generic docker://1.12.6
13. 其他
kubeadm tear down后,可重新kubeadm init 或 kubeadm join
kubectl drain <node name> --delete-local-data --force --ignore-daemonsets #master上運行 kubectl delete node <node name> #master上運行 kubeadm reset #被刪節點上運行 rm -rf ~/.kube/ #重置master節點時運行
Node節點部署
1. kubeadm,kubelet部署
服務器按照master節點安裝,執行至步驟9,不需要執行kubeadm init命令
2. docker http代理,拉取依賴鏡像
quay.io/calico/cni:v3.1.3 quay.io/calico/node:v3.1.3 k8s.gcr.io/kube-proxy-amd64:v1.11.1 k8s.gcr.io/pause:3.1
3. 加入Kubernetes集群
需要關閉服務器http代理,關閉docker http代理
執行安裝master節點時記錄的join命令
kubeadm join 172.16.78.243:6443 --token 2mn34f.q366f43n7nh0tjed --discovery-token-ca-cert-hash sha256:55989ef0da53df8ba12f9e9edef0474b351bd72b80c60dbc5eadf4ef5890c0b9
4. 在master節點驗證
kubectl get nodes
5. 其他
master節點的token 24小時過期后,可以通過命令產生新的token:
kubeadm token create
master節點上運行命令,可查詢token:
kubeadm token list
master節點上運行命令,可查詢discovery-token-ca-cert-hash值:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \ openssl dgst -sha256 -hex | sed 's/^.* //'
kubernetes-dashboard部署
參考 kubernetes-dashboard部署,kubernetes-dashboard版本為v1.8.3。
備注:kubectl delete -f xxx.yaml可以移除對於xxx.yaml安裝的dashboard。
-
部署
1. 使用國內私庫的dashboard鏡像
registry.cn-hangzhou.aliyuncs.com/jonny/kubernetes-dashboard-amd64:v1.8.3
2. master節點,下載kubernetes-danboard.yaml,修改鏡像為上一步中國內鏡像
wget http://mirror.faasx.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
3. 安裝
kubectl apply -f kubernetes-dashboard.yaml
4. 查看啟動狀態
kubectl get pods --all-namespaces
5. Master節點本機訪問【跳過該步驟】
kubectl proxy
-
創建用戶
1. 創建admin用戶
新建admin-user.yaml文件,內容如下:
apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kube-system
執行創建命令:
kubectl create -f admin-user.yaml
2. 綁定角色
新建admin-user-role-binding.yaml文件,內容如下:
apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kube-system
執行創建命令:
kubectl create -f admin-user-role-binding.yaml
3. 獲取該admin用戶的訪問token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
Token:
eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTh6anhsIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIxODNhMGZhYi05MGI0LTExZTgtODQwNy0wMDBjMjk3ZDJiNmEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.VPjQ7FlYOH6Y6UM1e3btIknQ9vFLjQfRGfvebTvML0dYjem1my8HsEAG8hVmz8IPQh9btLwwAuCq0Rxcp5ApuKVXmFfGN5r6ej3k4hvzsEjKAPGgOzY3N3u_YdIMxw_hgbppcF8wIk8433ruz_uSrFo7x5Rve7XMAK2qlsTEJG5YxOJktfkSEPNVnHz92KicrjlIdDF8wANpJisVkdaNeSCbFaYMKWEarp_2OuZ8wzt-HVfyMgcE1Pc045wH7goXQQ0n2kJtcsTgc3X3XoTEsbG_p188OIA_MBc1k68AeycAUFm-nf1Ugn65h0GIRHw1hITmPX8iyD-H_nMfLitpVA
-
集成Heapster插件
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/influxdb.yaml kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/grafana.yaml kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/heapster.yaml kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/rbac/heapster-rbac.yaml
使用的yaml文件是 https://github.com/kubernetes/heapster/tree/master/deploy/kube-config/influxdb 的國內鏡像
-
訪問Dasshboard
本文使用的是參考文檔中的API Server訪問dashboard方式,可在master節點服務器外訪問。用戶需要安裝證書訪問dashboard。
1. kubectl cluster-info 查看相關信息
Kubernetes master is running at https://172.16.78.243:6443 KubeDNS is running at https://172.16.78.243:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
2. 瀏覽器訪問dashboard
IP和端口使用上一步中的返回值對應IP和端口
https://172.16.78.243:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
此時瀏覽器返回403錯誤:
{ "kind": "Status", "apiVersion": "v1", "metadata": { }, "status": "Failure", "message": "services \"https:kubernetes-dashboard:\" is forbidden: User \"system:anonymous\" cannot get services/proxy in the namespace \"kube-system\"", "reason": "Forbidden", "details": { "name": "https:kubernetes-dashboard:", "kind": "services" }, "code": 403 }
3. 創建證書
# 生成client-certificate-data grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt # 生成client-key-data grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key # 生成p12 openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"
4. 導入證書
客戶端瀏覽器導入p12證書,重啟瀏覽器
如果Chrome版本過新導致無法訪問頁面,可以使用firefox嘗試。
5. 訪問dashboard
選擇token登入,輸入之前admin用戶的token
https://172.16.78.243:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
現在可以在環境上驗證kubernetes相關操作了。