使用Kubeadm安裝Kubernetes【單Master節點】


參考:Kubernetes官方文檔

   Kubernetes安裝方案選擇

     Centos 7 配置科學上網

         安裝Calico網絡插件

         kubernetes-dashboard部署

 

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. 配置服務器科學上網

參考Centos 7 配置科學上網

將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出現:

Error starting daemon: SELinux is not supported with the overlay2 graph driver on this kernel. Either boot into a newer kernel or disable selinux in docker (--selinux-enabled=false...
類似錯誤,可以在docker中禁用selinux。
修改 /etc/sysconfig/docker,設置OPTIONS中 --selinux-enabled=false,然后systemctl restart 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配置

vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
修改內容參考下圖

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網絡插件

參考安裝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
Master服務器瀏覽器訪問
 
  • 創建用戶

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相關操作了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM