ubuntu18.04搭建 kubernetes(k8s)集群


♦♦♦這里介紹使用kubeadm安裝k8s集群,因為這種搭建方式需要訪問grc.io(https://cloud.google.com/container-registry/)(國內被牆了)下載對應的image,所以需要確保自己能訪問該網站♦♦♦

♦♦♦即使網絡不能訪問,也有折中的解決辦法,具體請看詳細安裝步驟♦♦♦

安裝前准備:

  • 關閉iptables/ufw:  service ufw disable
  • 關閉swap:  swapoff  -a
  • Centos還需要關閉SELinux/firewalld

下面使用kubeadm來創建k8s cluster
1. 所有主機節點上都需要安裝docker

# sudo apt-get update
# sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# sudo apt-key fingerprint 0EBFCD88
output:
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

# sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
# sudo apt-get update
# sudo apt-get install docker-ce docker-ce-cli containerd.io

 

其他操作系統參考官方文檔: https://docs.docker.com/install/linux/docker-ce/ubuntu/


2. config /etc/hostname,config every node and hostname

修改主機名,規划好master和node

修改/etc/hostname文件來永久修改hostname

$ sudo hostnamectl set-hostname  k8s-nodex


3. (獨立安裝 kubectl,可以跳過本部選擇在步驟4中一起安裝)在所有節點上安裝 kubectl

# curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
# curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt  #獲取當前穩定版本
# curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.14.1/bin/linux/amd64/kubectl  #版本號根據需要可自行修改
# chmod +x ./kubectl
# sudo mv ./kubectl /usr/local/bin/kubectl
# source <(kubectl completion bash)

###ubuntu版本如果支持快捷安裝可以執行以下命令來安裝###
# sudo snap install kubectl --classi

 
4. 在所有節點上安裝  kubectl kubelet kubeadm

# apt-get update && apt-get install -y apt-transport-https
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
# cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
# apt-get update
# apt-get install -y kubectl kubelet kubeadm

國內請使用aliyun源:
# sudo apt-get update && apt-get install -y apt-transport-https # sudo curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - # sudo cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF # sudo apt-get update
# apt-get install -y kubectl kubelet kubeadm

 

5. 初始化master節點

♦♦♦

Kubenetes默認Registries地址是k8s.gcr.io,很明顯,在國內並不能訪問gcr.io,因此在kubeadm v1.13之前的版本,安裝起來非常麻煩,但是在1.13版本中終於解決了國內的痛點,其增加了一個--image-repository參數,默認值是k8s.gcr.io,我們將其指定為國內鏡像地址:registry.aliyuncs.com/google_containers,其它的就可以完全按照官方文檔來操作。

我們還需要指定--kubernetes-version參數,因為它的默認值是stable-1,會導致從https://dl.k8s.io/release/stable-1.txt下載最新的版本號,我們可以將其指定為固定版本(最新版:v1.14.2)來跳過網絡請求。

♦♦♦

pod網絡插件是必要安裝,以便pod可以相互通信. 請提前確認自己需要使用的pod網絡插件,以Flannel為例,為了使Flannel正常工作,執行kubeadm init命令時需要增加--pod-network-cidr=10.244.0.0/16參數

# kubeadm init --pod-network-cidr=10.244.0.0/16     # k8s.gcr.io可以訪問的情況下可以直接執行init
# kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.14.2 --pod-network-cidr=10.244.0.0/16  # 通過跳轉registry的方式安裝

以上兩種init的方式自己根據情況選擇執行
 
         
 

use tocken: qjm4v2.8mqfbjrtjpf2xmq2
output:
Your Kubernetes control-plane 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/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.100.0.128:6443 --token qjm4v2.8mqfbjrtjpf2xmq2 \
--discovery-token-ca-cert-hash sha256:65131ae78527130dfd6ccf0b6be6e86d2089c4d07856d7f318cede1ce84fb0ef

6. 安裝pod網絡插件flannel

# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

這里由於國內牆的原因,kubelet可能無法拉取flannel鏡像,需要手動執行命令拉取:
flannel 鏡像詳細的版本號可以執行以下命令查詢:
# kubectl get pod -n kube-system
# kubectl describe pod kube-flannel-ds-amd64-xxx -n kube-system # kube-flannel-ds-amd64-xxx 為上一條命令查詢出來的flannel pod
拉取鏡像:
# docker pull quay.io/coreos/flannel:v0.11.0-amd64 # 如果不能直接連接gcr.io,在node節點上也要手動拉取這個鏡像
§§特別說明一下,由於我家里是長城寬帶,執行命令拉取的時候還是報錯,於是我用手機共享了手機聯通網絡做熱點,結果還真的下載成功了!§§

 再次安裝flannel插件即可:

  # kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

  然后再查詢集群狀態,可以看到kube-flannel-ds-xxx Pod狀態為running,master節點狀態也變為Ready,表明master節點初始化成功了。happy!!!

  

 

 flannel支持多種模型

  • VxLAN #vxLAN有以下兩種模式
    • vxlan #疊加網絡或者隧道網絡,通過封裝網絡報文的方式使不同網段的pod之間可以通訊
    • Directrouting #直接使用主機的IP地作為網關,通過主機路由的方式與目標pod進行通訊,當目標pod與當前pod不在同一三層網絡內,會自動降級為VxLAN模式
  • host-gw: Host GateWay #與VxLAN的Directrouting模式相同,當目標pod與當前pod不在同一三層網絡內時,pod之間無法通訊
  • UDP: #早期由於Linux內核不支持VxLAN,host-gw又有非常高的入門門檻,udp是flannel最早期使用的模式,由於使用普通的udp報文通訊,性能非常差,在可以使用前面兩種模式的情況下請勿使用該模式
  • 默認flannel的模式為vxlan,可以修改為性能更好的directrouting模式,修改見下圖

    

 

 

7. 添加node工作節點

  • SSH到node節點
  • 切換到root用戶
  • 執行添加node命令:
# kubeadm join --token <token> <master-ip>:<master-port>
這里可以直接copy master節點init過程末尾的kubeadm join 命令行直接執行

默認情況下,token的有效期是24小時,如果我們的token已經過期的話,可以使用以下命令重新生成:
# kubeadm token create

 如果我們也沒有--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/^.* //'

 8. 所有node節點加入到master節點之后,可以執行以下命令查看集群信息

# kubectl get nodes

[root@maple-master opt]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
maple-master Ready    master 30m v1.14.2
k8s-node1    Ready    node   2m v1.14.2
k8s-node2    Ready    node   2m v1.14.2

 

Note: kubeadm reset 可以重置'kubeadm init' or 'kubeadm join'的操作。  同時需要刪除家目錄下的.kube 目錄。才能恢復到初始化之前的狀態

 

參考文檔:http://docs.kubernetes.org.cn/459.html

     https://kubernetes.io/zh/docs/setup/independent/install-kubeadm/

     https://www.cnblogs.com/yitianyouyitian/p/10143217.html  解決了國內無法下載相關image的問題,成功init

 


免責聲明!

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



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