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)
这里介绍怎么修改默认值
[root@node-150 ~]# cat /etc/kubernetes/kubelet
..........(omit some message)........
# Add your own!
KUBELET_ARGS="--max-pods=200"
重启kubelet服务。