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
對於測試環境足夠,但是生產環境是不夠的(主機效能足以支撐更大數量的pod)
這裡介紹怎麼修改預設值
[[email protected] ~]# cat /etc/kubernetes/kubelet
..........(omit some message)........
# Add your own!
KUBELET_ARGS="--max-pods=200"
重啟kubelet服務。