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)

这里介绍怎么修改默认值


[root@node-150 ~]# cat /etc/kubernetes/kubelet 

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


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

重启kubelet服务。

你可能感兴趣的:(kubernetes)