在一个Pod中,可能有一个或多个容器。只要有Pod,就会启动Pause这个容器,Pod中的容器会共用这个pause的网络栈和存储卷。也就是说这两个容器没有自己独立的Ip地址,有的是这个pod的地址。这也就意味着,在同一个Pod里面,容器的端口不能设为同样的值,比如一个php和一个nginx容器,你把他们的端口都设置为9000,那这个pod肯定是起不来的,或者起来之后无限重启。

下面准备搭建K8s集群,需要一台master节点,两台node节点,配置CentOS 7.9 系统,网络设置为NAT模式,硬盘大小都为100G。

这里着重讲一下两个问题,花费了我整整一个下午的时间都没有解决,查阅了很多的资料和博客最后发现了问题:

①第一个就是VMware的网络设置,子网IP必须和虚拟机的Ip地址在一个网段,比如我的Master节点的ip地址设置为了192.168.88.100,另外两台node节点设置为192.168.88.101和192.168.88.102。这个问题导致的是我主机都无法和虚拟机相互ping通。

      ②第二个问题就是,在我解决了上述问题之后,当我使用xshell对虚拟机进行连接时发现无法做出任何反应,不出现用户名之类的,如下图

K8S一个pod怎么配置多个容器 k8s一个pod多个端口_加载

解决方法就是:

vi /etc/ssh/sshd_config

然后将里面的#UseDNS yes 改为 UseDNS no(注意去掉#)

然后重启ssh服务:

service sshd restart

成功:

K8S一个pod怎么配置多个容器 k8s一个pod多个端口_Pod_02

下面进行系统的初始化:


1、 关闭防火墙和禁用iptables:

      Kubernetes和Docker在运行过程中会产生大量的iptables规则,为了不让系统规则跟他们混淆,直接关闭系统的规则:

# 关闭防火墙
$ systemctl stop firewalld
$ systemctl disable firewalld
# 关闭iptables服务
$ systemctl stop iptables
$ systemctl disable iptables

2、关闭 selinux:

     selinux是linux系统下的一个安全服务,如果不关闭他,在安装集群的过程中会出现各种各样的问题:



#编辑 /etc/selinux/config 文件 修改SELINUX的值为disabled
#注意修改完成后要重启linux服务
SELINUX=disabled

3、关闭 swap

       swap分区指的是虚拟内存分区,它的作用是物理内存使用完之后,将磁盘空间虚拟成内存来使用。启用swap设备会对系统的性能产生非常负面的影响,因此Kubernetes要求每个节点都禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行说明。



#编辑分区配置文件 /etc/fstab  注释掉swap分区那一行
# /dev/mapper/centos-swap swap
#注意修改完毕之后需要重启linux服务

4、对主机名进行设置

$ hostnamectl set-hostname <hostname>

三台机器分别为master、k8s-node1、k8s-node2

5、主机名解析

        为了方便后面集群节点间的直接调用,在这里配置一下主机名解析,但是在企业中推荐使用内部DNS服务器

cat >> /etc/hosts << EOF 
192.168.88.100 master 
192.168.88.101 k8s-node1 
192.168.66.102 k8s-node2 
EOF



6、 将桥接的 IPv4 流量传递到 iptables 的链:

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system          # 生效

7、 时间同步

        Kubernetes要求集群中的节点时间必须是精确一致的,这里我们使用chronyd服务从网络同步时间,在企业内部推荐配置内部的时间同步服务器

#启动chronyd服务
systemctl start chronyd
#设置chronyd服务开机自启
systemctl enable chronyd
#稍等一会就可以用date命令进行验证了

K8S一个pod怎么配置多个容器 k8s一个pod多个端口_K8S一个pod怎么配置多个容器_03

 8、修改linux内核参数

    修改linux内核参数,添加网桥过滤和地址转发功能

# 新建一个文件kubernetes.conf
$ vim /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
#为了让文件生效,需要重新加载一下配置
$ sysctl -p
# 加载网桥过滤模块
$ modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
$ lsmod | grep br_netfilter

K8S一个pod怎么配置多个容器 k8s一个pod多个端口_加载_04

 模块存在,证明加载成功。

9、配置ipvs功能

        在Kubernetes中service有两种代理模型,一种是基于iptables,一种是基于ipvs的,两者相比较的话,ipvs的性能明显是要高一点的,但是如果说要使用它,就需要手动载入ipvs模块

# 1、安装ipset和ipvsadm
$ yum install ipset ipvsadm -y
# 2、添加需要加载的模块写入脚本文件
$ cat <<EOF > /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
# 3、为脚本文件添加执行权限
$ chmod +x /etc/sysconfig/modules/ipvs.modules
# 4、执行脚本文件
$ /bin/bash /etc/sysconfig/modules/ipvs.modules
# 5、查看对应模块是否加载成功
$ lsmod | grep -e ip_vs -e nf_conntrack-ipv4

可以看到这五个模块都在里面了:

K8S一个pod怎么配置多个容器 k8s一个pod多个端口_K8S一个pod怎么配置多个容器_05

 10、重启之后检查selinux和swap分区是否关闭

K8S一个pod怎么配置多个容器 k8s一个pod多个端口_重启_06

    看到都是关闭状态。。。