1. 程式人生 > >kubernetes 技巧彙總

kubernetes 技巧彙總

kubernetes使用過程中遇到很多限制。這裡記錄總結下方便日後自己查詢。

1. 修改預設Service Port Range

Default 是30000-32767。 如果超出此範圍,建立service時就會報錯:

spec.ports[0].nodePort: Invalid value: 20001: provided port is not in the valid range

修改apiserver的配置檔案:

========

# Add your own!

#KUBE_API_ARGS=""
KUBE_API_ARGS="--service-node-port-range=20000-65535“    <--  建議最低埠號不要過小,防止與其他程式衝突


========

重啟apiserver,重新建立埠號20001的Service,驗證Port Range是否修改成功。

2. cAdvisor 啟動失敗

下載google提供的cAdvisor映象(https://hub.docker.com/r/google/cadvisor)。

執行該映象後幾秒內異常退出。檢查log如下:

==========

...... <省略部分無關日誌>.....

I1011 06:26:06.769002       1 manager.go:290] Recovery completed
F1011 06:26:06.769030       1 cadvisor.go:151] Failed to start container manager: inotify_add_watch /sys/fs/cgroup/cpuacct,cpu: no such file or directory

==========

google後發現這是最新版cAdvisor的bug,記錄下workaround

mount -o remount,rw '/sys/fs/cgroup'
ln -s /sys/fs/cgroup/cpu,cpuacct /sys/fs/cgroup/cpuacct,cpu

3. 不同node上容器間使用NAT進行通訊

demo:

nodeA:  flannel  182.30.38.0  其上執行的containerA :  182.30.38.2

nodeB:  flannel  182.30.90.0  其上執行的containerB :  182.30.90.2

從containerA  ping  containerB ,然後在containerB上抓包:

tcpdump -vnn icmp
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
08:12:56.025743 IP (tos 0x0, ttl 62, id 7748, offset 0, flags [DF], proto ICMP (1), length 84)
    182.30.38.0 > 182.30.90.2: ICMP echo request, id 23, seq 1, length 64
08:12:56.025783 IP (tos 0x0, ttl 64, id 20493, offset 0, flags [none], proto ICMP (1), length 84)
    182.30.90.2 > 182.30.38.0: ICMP echo reply, id 23, seq 1, length 64

從上可以看出,containerB上收到的containerA發來的ping包,但是containerA 的IP地址被NAT成了nodeA的flannel的地址。

平時這麼做沒毛病。

但是總有出意外的時候

比如:構築hadoop叢集。網上很多人遇到datanode無法註冊問題:

http://stackoverflow.com/questions/33644786/hdfs-cluster-cant-work-with-kubernetes-flannel

這裡總結下修改辦法:

(1).  /etc/sysconfig/flanneld 增加下列配置

FLANNEL_OPTIONS="--ip-masq=true"

(2). /usr/lib/systemd/system/docker.service  增加下列配置

ExecStart=/usr/bin/docker-current daemon  --ip-masq=false \

(3). 清空iptables  (這步很重要。否則新iptables無法覆蓋舊iptables)

iptables -F

iptables -Z

iptables -X

iptables -t nat -F

iptables -t nat -Z

iptables -t nat -X


(4). 很多人說/etc/kubernetes/proxy 增加 --proxy-mode=iptables

其實不需要修改:k8s從1.2之後proxy mode預設是iptables了

(5). 然後重啟服務:

systemctl stop   docker flanneld kube-proxy kube-proxy

systemctl daemon-reload

systemctl start docker flanneld kube-proxy kube-proxy

再次進行測試:

# tcpdump -vnn icmp
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
08:26:54.054948 IP (tos 0x0, ttl 62, id 7748, offset 0, flags [DF], proto ICMP (1), length 84)
    182.30.38.2 > 182.30.90.2: ICMP echo request, id 26, seq 1, length 64
08:26:54.054983 IP (tos 0x0, ttl 64, id 14253, offset 0, flags [none], proto ICMP (1), length 84)
    182.30.90.2 > 182.30.38.2: ICMP echo reply, id 26, seq 1, length 64

可以看出已經可以獲得container B的真實IP了。

4. max pod 修改

# kubectl describe node node-A : 

...(omit some message)...

Capacity:
 cpu:8
 memory:49285256Ki
 pods: 110

預設情況下,每個node的pod最大數量是110。

對於測試環境足夠,但是生產環境是不夠的(主機效能足以支撐更大數量的pod)

這裡介紹怎麼修改預設值

[[email protected] ~]# cat /etc/kubernetes/kubelet 

..........(omit some message)........


# Add your own!
KUBELET_ARGS="--max-pods=200"

重啟kubelet服務。