二進制部署k8s的一些坑
一、前言
本文不打算對k8s做過多介紹,僅僅介紹部署過程中的一些踩坑點。
關於k8s的一些掃盲文章可以參考下(微信打開):
(1)https://mp.weixin.qq.com/s/F1YzaDGy8E1xK42zkyK9ug
(2)師兄公眾號的一篇文章(權威指南我也借了,哈哈哈~):https://mp.weixin.qq.com/s/L6ZYfD0KLytQy8ANgD-AIQ
步入正題,參考部署的二進制文章如下: https://www.yuque.com/duduniao/k8s/tr3hch
(感謝小俊子分享~~之前找的部署文章害我搞了兩周還一堆報錯解決不了的,不得不重建虛擬機重新部署)
畫了個思維導圖:https://www.kdocs.cn/view/l/stCinacy3eKu? (因為部署完還是有點懵逼 = =),
總共4台機器,服務器規划如下:

網絡規划如下:

二、部署過程中遇到的坑
1、dns問題
安裝完dns,主機hostname解析不了
先說明下,文中部署dns服務配置區域文件,業務域:od.com 這個域名是用不了的,應該被注冊了,需要改成別的,我這里改成 odljy.com了。

按步驟2.2.2把所有主機的dns都指向到部署了dns服務的主機ip上的,在dns服務器(k8s-3)測試時不行: host k8s-4 10.4.7.130,報錯:Host k8s-4 not found。

這個小俊子幫我解決的,感謝感謝~~
問題解決:
修改主機dns客戶機配置文件(感覺這步應該要放到測試dns前面做的)
[root@k8s-3 ~]# cat /etc/resolv.conf ——》所有主機都要改下
# Generated by NetworkManager
search host.com
nameserver 10.4.7.130
nameserver 8.8.8.8
以防萬一,我在網絡配置文件也加了DNS的配置

2、harbor問題
(1)瀏覽器訪問harbor報錯502
注意:windows機器要寫hosts

nginx日志報錯:
2020/11/24 08:44:45 [crit] 46682#0: *71 connect() to 127.0.0.1:180 failed (13: Permission denied) while connecting to upstream, client: 10.4.7.1, server: harbor.odljy.com, request: "GET /favicon.ico HTTP/1.1", upstream: "http://127.0.0.1:180/favicon.ico", host: "harbor.odljy.com", referrer: "http://harbor.odljy.com/"
問題解決:關閉防火牆
臨時關閉:setenforce 0
永久關閉:
/etc/selinux/config 中的
SELINUX=enforcing 改成
SELINUX=
disabled
(2)其他機器登錄不上harbor,無法上傳鏡像:
報錯現象:
[root@k8s-1 ~]# docker login -u admin harbor.odljy.com
Password:
Error response from daemon: Get http://harbor.odljy.com/v2/: Get http://harbor.od.com:180/service/token?account=admin&client_id=docker&offline_token=true&service=harbor-registry: net/http: request canceled (Client.Timeout exceeded while awaiting headers) (Client.Timeout exceeded while awaiting headers)
我一開始以為是這個私有倉庫域名沒有添加到docker的配置文件/etc/docker/daemon.json 導致的,發現怎么改都不行
問題解決:
文中安裝harbor的install.sh 之前是改了配置文件:harbor.yml 的hostname的,當時我運行install.sh的時候hostname用的是:harbor.od.com,后來發現域名od.com已經被用了,所以install.sh 之后才改回到 harbor.odljy.com,然后重啟harbor就能識別這個新hostname,竟然不行。
所以要解決的話,停掉harbor再裝(運行install.sh)吧,前提是已經改好harbor.yml 想要的hostname:
cd /opt/apps/harbor
/usr/bin/docker-compose stop
然后運行: ./install.sh
三、kubectl 問題
1、kubectl get node返回資源為空
[root@k8s-1 ~]# kubectl get node
——》 No resources found

問題解決:
(這個是我腦殘,竟然漏了這步沒做 = =! 我這里只在k8s-1做了,當然做兩台更完美了)

這個是k8s-1 的nginx配置:vim /etc/nginx/nginx.conf
監聽7443端口,轉發到apiserver的兩台機器上
四、核心插件部署問題
【i】CNI網絡插件
1、驗證跨網絡訪問
問題: kubectl get pods ——》 返回為空

問題解決:要自己新建一個pod來,舉個栗子(群上大神幫搞的,感激感激):
k8s-2機器運行:
先拉一個nginx鏡像,傳到harbor上
(1)mkdir -p /data/yaml
(2)vim nginx.yaml
(3)kubectl apply -f nginx.yaml
然后就有pods了
2、 解決pod間IP透傳問題
pod里面日志看不到
tail -F /var/log/nginx/access.log ——》為空
問題解決:
宿主機: kubectl logs -f nginx-ds-j8hd7 這樣看可以看到日志
看到pod內的nginx日志做了個軟鏈接,把nginx日志重定向到null了,只能外面的控制台看
【ii】CoreDNS插件
問題:內網解析可以,外網解析(百度域名)不了
內網解析可以:
dig -t A nginx-web.default.svc.cluster.local @192.168.0.2 +short # 內網解析OK
192.168.124.229
外網解析不了:
dig -t A www.baidu.com @192.168.0.2 +short ——》為空

問題解決:
5.2.2. coredns的資源清單文件(k8s-4) 中的 configmap.yaml 要改下ip
vim /data/k8s-yaml/coredns/coredns_1.6.1/configmap.yaml

改成部署DNS機器的ip(k8s-3)
forward是 當前DNS沒解析就轉到指定的DNS解析
【iii】Ingress-Controller插件
1、交付traefik到k8s
問題報錯現象:kubectl get pods -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-74998cf4c7-pw6zp 1/1 Running 0 17h 172.7.128.3 k8s-1 <none> <none>
traefik-ingress-5jcw8 1/1 Running 0 28m 172.7.128.5 k8s-1 <none> <none>
traefik-ingress-sr6s5 0/1 ContainerCreating 0 28m <none> k8s-2 <none> <none>

問題解決:
1、看pod日志(要指定命名空間):
kubectl describe pod xxxxx -n kube-system
[root@k8s-1 conf.d]# kubectl describe traefik-ingress-5jcw8 -n kube-system
報錯信息:
Warning FailedCreatePodSandBox 31m kubelet, k8s-2 Failed create pod sandbox: rpc error: code = Unknown desc = failed to start sandbox container for pod "traefik-ingress-sr6s5": Error response from daemon: driver failed programming external connectivity on endpoint k8s_POD_traefik-ingress-sr6s5_kube-system_b078b6ee-e925-4267-ab56-a681c4e18d69_4 (853306a4fea13ec51ad737bcb88e1e8840f24f245892318c0fed9fc93a854a0f): (iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.7.129.3 --dport 80 -j ACCEPT: iptables: No chain/target/match by that name.

2、 k8s-2 重啟docker
[root@k8s-2 ~]# systemctl restart docker
################
還有些問題沒解決,到時再說吧:
supervisorctl 關服務沒關好,導致啟動報錯,不得不 kill 進程
