阿里云ecs体验
本人计算机专业本科在读,由于最近想学习一下kubernetes,需要一台云主机,到阿里云搜索学生主机出现了“飞天加速计划·高校学生在家实践”活动。
首先kubernetes的安装需要开放一段端口号,阿里云的安全组可以一口气开放一段端口号。
在搭建过程中,主要出现的问题就是搭建之后的master节点无法与node节点通信。我也为此查询了很多资料。解决过程如下:
1.在kubeadm时就需要指定公网ip
下面时我创建时的yaml文件
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: ip:6443
clusterName: kubernetes
apiServer:
certSANs:
- ip
extraArgs:
authorization-mode: Node,RBAC
advertise-address: ip
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
注意apiServer下面的controlPlaneEndpoint,certSANs写公网ip,extraArgs的advertise-address同公网ip。
然后通过下面命令初始化
kubeadm init --config=kubeinit.yaml | tee kubeadm-init.log
然后按照提示cp配置文件。
2.开放对应的端口
在云主机的安全组规则中需要配置下面的端口号,master和node都要配置
master开放对应的协议端口,注意不全是tcp
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10252/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --permanent --add-port=53/udp
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --permanent --add-port=9153/tcp
node开放端口
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --permanent --add-port=53/udp
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --permanent --add-port=9153/tcp
3.修改node配置
在网上查阅的过程中,我了解到可以用tcpdump检测网络包。
这里需要先简略描述一下包在kubernetes中发送的过程:dockerContainer->flannel.1网卡->flannel进程->eth0网卡->出去
其中flannel.1和eth0是可以用tcpdump监控的,flannel进程不太好处理,先处理前者。
执行tcpdump -i flannel.1 -s0 -nnn
监控flannel.1网卡
结果:
发现只有去的包,没有回来的,我们再监控eth0,8472是flannel的端口tcpdump -i eth0 -s0 -nnn udp and port 8472
发现目的地的ip不是公网ip,是内网ip,那这个包肯定就过不去。
通过kubectl describe nodes k8s-node-2
得到node信息。
Name: k8s-node-2
Roles: <none>
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=k8s-node-2
kubernetes.io/os=linux
Annotations: flannel.alpha.coreos.com/backend-data: {"VNI":1,"VtepMAC":"7e:a5:78:f3:de:1c"}
flannel.alpha.coreos.com/backend-type: vxlan
flannel.alpha.coreos.com/kube-subnet-manager: true
flannel.alpha.coreos.com/public-ip: 10.0.16.5
kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
node.alpha.kubernetes.io/ttl: 0
volumes.kubernetes.io/controller-managed-attach-detach: true
在public-ip部分,显示的是内网ip,把他改成外网ip。
[root@k8s-master ~]# kubectl annotate node k8s-node-2 flannel.alpha.coreos.com/public-ip-overwrite=43.138.19.214 --overwrite
node/k8s-node-2 annotated
[root@k8s-master ~]# kubectl -n kube-system get pods --field-selector spec.nodeName=k8s-node-2 | grep flannel
kube-flannel-ds-ddn72 1/1 Running 0 56m
[root@k8s-master ~]# kubectl -n kube-system get pod kube-flannel-ds-ddn72 -o yaml | kubectl replace --force -f -
pod "kube-flannel-ds-ddn72" deleted
pod/kube-flannel-ds-ddn72 replaced
这个时候通过master公网ip:端口就能成功访问了。
后记:k8s部署花了一周,一开始总是安装报错,后来是访问不到节点,在网上翻阅资料过程中,大概了解到问题的排查可以从一下几个方面入手:
journal -xe命令查看,这个是在安装时候最多出现的
docker logs 容器id,因为k8s里面运行的是容器,所以可以直接看容器日志
kubectl describe XX,这个可以直接查看某个资源的状态
tcpdump ,网络curl不通,那就用网络监视工具查看一下包的情况
firewalld相关命令,有的时候并不能排除防火墙的问题,需要查看状态
当然最重要的是,排查错误的过程中了解到了很多组件的意义,apiserver,etcd,kube-proxy是最可能出问题的三个兄弟,需要明白这三者的作用和联系。