物聯網架構成長之路(43)-k8s從入門到放棄


0. 前言

  這段時間要入門一下CI/CD了,以前簡單的了解過Jenkins,現在要把以下的這個圖的架構搭建起來。國外可能一兩個命令就安裝完成的事情,我折騰了2天多,真的差點放棄了。

 

1. 安裝VirtualBox
  參考這篇官方文檔 https://www.virtualbox.org/wiki/Linux_Downloads
  在 /etc/apt/sources.list 增加以下內容

deb [arch=amd64] https://download.virtualbox.org/virtualbox/debian stretch contrib

  下載簽名

1 wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
2 apt-get update
3 apt-get install virtualbox-6.0

  安裝后,最好重啟一下。

 

2. 安裝操作系統
  下載debian 鏡像

wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.1.0-amd64-netinst.iso

  創建一個鏡像,然后配置一下iso鏡像啟動,然后安裝操作系統。

  接下來就是普通的Linux安裝了

  安裝成功后,安裝幾個日常工具后,就可以復制多份鏡像出來,然后就可以進行練習了。

  修改VM虛擬機為橋接,那么就可以運行局域網內任何計算機通過IP進行訪問。
  修改/etc/ssh/sshd_confg 中的 PermitRootLogin yes 允許root用戶登錄。

 

3. 安裝docker
  Debian10 可以直接安裝,不需要修改/etc/apt/source.list

apt-get install docker.io

  創建 /etc/docker/daemon.json 文件,並添加如下內容:

1 {
2   "registry-mirrors": ["https://xd80iytl.mirror.aliyuncs.com"]
3 }

  如果有其它鏡像庫,也可以添加到這里面,registry-mirrors的值是一個數組;
  重啟docker服務

service docker restart

 

4. 安裝kubernetes

4.1 安裝k8s
  增加證書

wget -q https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg -O- | apt-key add -

  往 /etc/apt/source.list 增加

1 deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
2 apt-get update
3 apt-get install kubeadm kubectl kubectx kubelet kubernetes-cni

4.2 修改三台主機名稱,並寫到/etc/hosts

1 hostnamectl set-hostname master
2 hostnamectl set-hostname node1
3 hostnamectl set hostname node2

  寫到 /etc/hosts

1 172.16.23.200 master
2 172.16.23.142 node1
3 172.16.23.157 node2

4.3 修改內核參數
  修改內核參數 /etc/sysctl.d/k8s.conf

1 net.bridge.bridge-nf-call-ip6tables = 1
2 net.bridge.bridge-nf-call-iptables = 1
3 net.ipv4.ip_forward = 1

  立即生效

sysctl --system

如果還報這個錯
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables does not exist
[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
#那么執行
modprobe br_netfilter
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

4.4 關閉交互內存swap

swapoff -a

4.5 重置kubeadm

1 kubeadm reset
2 rm -rf ~/.kube/
3 service kubelet restart
4 systemctl status kubelet

4.6 下面這個在Master主機執行

kubeadm init --apiserver-advertise-address=172.16.23.200 --pod-network-cidr 10.244.0.0/16 --image-repository registry.aliyuncs.com/google_containers --v=5

  注意172.16.23.200 這個是Master主機IP。而10.244.0.0/16先要這么寫,后續安裝CNI的flannel插件的時候,會依賴這個虛擬網絡地址。然后由於眾所周知原因,需要指定鏡像倉庫為aliyuncs。

  如果init過程中出現,錯誤,需要重置的,可以執行

1 kubeadm reset
2 rm -rf ~/.kube/

  成功后截圖【放心,一般沒有那么容易成功,這個安裝太多坑了】

 

4.7 按要求執行這些命令

1 mkdir -p $HOME/.kube
2 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
3 sudo chown $(id -u):$(id -g) $HOME/.kube/config

4.8 記錄節點node加入集群的 kubeadm join 信息

1 kubeadm join 172.16.23.200:6443 --token rm9y0a.u550ra92k4rh9wca \
2   --discovery-token-ca-cert-hash sha256:428c8c94afd1697cb8ca2d5c5571d194a0db4b91056219e7a9e9f31b9bf60037
3 
4 #若忘記join token,可通過以下命令獲取
5 kubeadm token create --print-join-command

4.9 安裝CNI插件
  執行 kubectl get nodes 發現status狀態是 NotReady,通過service kubelet status 發現錯誤原因

 1 root@master:~# kubectl get nodes
 2 NAME     STATUS     ROLES    AGE     VERSION
 3 master   NotReady   master   2m56s   v1.16.2
 4 root@master:~# service kubelet status
 5 ● kubelet.service - kubelet: The Kubernetes Node Agent
 6    Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
 7   Drop-In: /etc/systemd/system/kubelet.service.d
 8            └─10-kubeadm.conf
 9    Active: active (running) since Wed 2019-11-06 10:04:54 CST; 3min 33s ago
10      Docs: https://kubernetes.io/docs/home/
11  Main PID: 4498 (kubelet)
12     Tasks: 19 (limit: 2359)
13    Memory: 43.2M
14    CGroup: /system.slice/kubelet.service
15            └─4498 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --cgroup-driver=cgroupfs
16 
17 Nov 06 10:08:04 master kubelet[4498]: W1106 10:08:04.523652    4498 cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d
18 Nov 06 10:08:04 master kubelet[4498]: E1106 10:08:04.852874    4498 kubelet.go:2187] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin i
19 Nov 06 10:08:09 master kubelet[4498]: W1106 10:08:09.525813    4498 cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d
20 Nov 06 10:08:09 master kubelet[4498]: E1106 10:08:09.863154    4498 kubelet.go:2187] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin i
21 Nov 06 10:08:14 master kubelet[4498]: W1106 10:08:14.527639    4498 cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d

  出現Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of “crypto/rsa: verification error” while trying to verify candidate authority certificate “kubernetes”) 修改配置

export KUBECONFIG=/etc/kubernetes/admin.conf

  修改/etc/hosts 【我這里臨時性訪問不了這個網站,可以通過修改hosts,附件提供】

151.101.56.133    raw.githubusercontent.com

  安裝CNI
  在安裝完 Master 節點后,查看節點信息( kubectl get nodes)會發現節點的狀態為noready。查看noready的原因發現是由於cni插件沒有配置(容器網絡接口)。其實這是由於還沒有配置網絡。可以配置多種網絡,這里我們選用最長遠的 fannel 網絡進行配置。

1 wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
2 kubectl apply -f kube-flannel.yml

  如果要重置可以執行 kubectl delete -f kube-flannel.yml
  由於kube-flannel.yml 里面鏡像是來自quay.io, 需要改為 quay-mirror.qiniu.com

  還是會出現 Unable to update cni config: No networks found in /etc/cni/net.d
  解決:修改文件內容: /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 第5行增加這句

Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/ --cni-bin-dir=/opt/cni/bin"

 

4.10 執行重新啟動命令

1 systemctl daemon-reload
2 systemctl restart kubelet.service
3 service docker restart
4 service kubelet restart
5 # 等系統啟動和服務發現,預計1-2分鍾
6 kubectl get nodes

4.11 以上過程,如果出現不成功,重啟再執行一遍,慢慢排查原因。

  哈哈

 

5. 節點Node 加入 Master
在兩個節點node1 和 node2 執行

1 kubeadm join 172.16.23.200:6443 --token rm9y0a.u550ra92k4rh9wca \
2     --discovery-token-ca-cert-hash sha256:428c8c94afd1697cb8ca2d5c5571d194a0db4b91056219e7a9e9f31b9bf60037

  在Master機上,執行查看命令

 

6. 練習啟動Pod

1 #啟動兩個Nginx
2 kubectl run nginx --image=nginx:1.10 --port=80 --replicas=2
3 #通過 kubectl get pod --all-namespaces -o wide 發現一直處於ContainerCreating ,因為下載nginx 需要182M。等2-3分鍾后,完成部署,處於Running狀態
4 #排查問題
5 kubectl get pods
6 kubectl describe pod nginx
7 #刪除
8 kubectl delete pod nginx-b864db7b7-lpc76
9 kubectl delete deployment nginx

  通過YAML模版方式部署集群

 1 apiVersion: apps/v1
 2 kind: Deployment
 3 metadata:
 4   name: nginx1
 5 spec:
 6   replicas: 1
 7   selector:
 8     matchLabels:
 9       name: nginx1
10   template:
11     metadata:
12       labels:
13         name: nginx1
14     spec:
15       containers:
16         - name: nginx1
17           image: nginx:1.13
18           imagePullPolicy: IfNotPresent
19           ports:
20             - containerPort: 80
21 ---
22 apiVersion: v1
23 kind: Service
24 metadata:
25   name: nginx-service-nodeport
26 spec:
27   ports:
28     - port: 80
29       targetPort: 80
30       protocol: TCP
31   type: NodePort
32   selector:
33     name: nginx1

  執行

kubectl apply -f nginx.yaml

  還有很多高級命令,如創建、查看、滾動更新、回滾、擴容、縮容,各種集成玩法。

7. 從入門到放棄
  k8s真丶從入門到放棄。這個環境配置了兩天,我最后可能選擇放棄,投入到Rancher的懷抱。

 

參考資料:
  https://blog.csdn.net/qq_21816375/article/details/80222689
  https://www.cnblogs.com/omgasw/p/10548334.html
  https://blog.csdn.net/ywq935/article/details/80109090
  https://my.oschina.net/jianming/blog/2354157
  https://blog.csdn.net/oMaoYanEr/article/details/102762654
  https://www.cnblogs.com/wjoyxt/p/9988158.html
  https://www.jianshu.com/p/63f7f5c021e4

附件下載:https://files.cnblogs.com/files/wunaozai/kube-flannel.zip

本文地址:https://www.cnblogs.com/wunaozai/p/11805259.html

本系列目錄: https://www.cnblogs.com/wunaozai/p/8067577.html

個人主頁:https://www.wunaozai.com/


免責聲明!

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



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