centos 跨网段,centos9出来了吗
k8s安装部署
K8s集群搭建
1 centos版本信息查看
[root@localhost~]# uname-a
Linux localhost.localdomain 3.10.0-862.el7.x86_64#1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
k8s集群机器关闭防火墙
[root@localhost~]# systemctl stop firewalld
[root@localhost~]# systemctl disable firewalld
Removed symlink/etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
2安装必要的包
k8s集群安装以下安装包
[root@k8s-node~]# yum-y install net-tools wget vim ntpd
[root@k8s-node~]# systemctl enable ntpd
[root@k8s-node~]# systemctl start ntpd
3配置hosts
[root@k8s-node~]# cat/etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.248.141 k8s-master
192.168.248.142 k8s-node
4部署master节点
4.1 Master节点安装必要的安装包
[root@k8s-master~]# yum-y install etcd
4.2更改/etc/etcd/etcd.conf配置文件
[root@k8s-master etcd]# cat/etc/etcd/etcd.conf| grep-v"^#"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS=""
ETCD_NAME="master"
ETCD_ADVERTISE_CLIENT_URLS=
4.3设置开机启动并验证状态
[root@k8s-master~]#systemctl enable etcd
[root@k8s-master~]#systemctl start etcd
etcd检查
[root@k8s_master~]# etcdctl-C cluster-health
member 8e9e05c52164694d is healthy: got healthy result from cluster is healthy
[root@k8s_master~]# etcdctl-C cluster-health
member 8e9e05c52164694d is healthy: got healthy result from cluster is healthy
5安装部署docker环境(略)
6安装kubernetes
[root@k8s_master~]# yum install kubernetes
安装过程中报错如下
Error: docker-ce conflicts with 2:docker-1.13.1-75.git8633870.el7.centos.x86_64
可以执行如下命令解决
1、查看安装过的docker:yum list installed| grep docker
2、卸载docker:yum remove-y docker-ce.x86_64 0:18.03.0.ce-1.el7.centos
3、删除容器镜像:rm-rf/var/lib/docker
再次安装kubernetes,安装成功,而且会自动安装docker
6.1修改apiserver服务的配置文件
[root@k8s-master kubernetes]# cat/etc/kubernetes/apiserver| grep-v"^#"
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBE_ETCD_SERVERS="--etcd-servers="
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS=""
6.2修改config配置文件:
[root@k8s-master kubernetes]# cat/etc/kubernetes/config| grep-v"^#"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master="
设置开机启动,开启服务
[root@k8s-master~]#systemctl enable kube-apiserver kube-controller-manager kube-scheduler docker
[root@k8s-master~]#systemctl start kube-apiserver kube-controller-manager kube-scheduler docker
6.3查看服务端口:
[root@k8s-master~]# netstat–tnlp
Active Internet connections(only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1273/master
tcp 0 0 127.0.0.1:2380 0.0.0.0:* LISTEN 2126/etcd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 571/rpcbind
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1362/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 998/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 996/cupsd
tcp6 0 0::1:25 :::* LISTEN 1273/master
tcp6 0 0:::4001 :::* LISTEN 2126/etcd
tcp6 0 0:::6443 :::* LISTEN 3216/kube-apiserver
tcp6 0 0:::10251 :::* LISTEN 3222/kube-scheduler
tcp6 0 0:::2379 :::* LISTEN 2126/etcd
tcp6 0 0:::10252 :::* LISTEN 3221/kube-controlle
tcp6 0 0:::111 :::* LISTEN 571/rpcbind
tcp6 0 0:::8080 :::* LISTEN 3216/kube-apiserver
tcp6 0 0:::22 :::* LISTEN 998/sshd
tcp6 0 0::1:631 :::* LISTEN 996/cupsd
7部署node节点
7.1安装docker(略)安装k8s(略)
7.2 Node节点主机做以下配置:
修改config配置文件
[root@k8s-node kubernetes]# cat/etc/kubernetes/config| grep-v"^#"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master="
修改kubelet配置文件
[root@k8s-node kubernetes]# cat/etc/kubernetes/kubelet| grep-v"^#"
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=192.168.248.142"
KUBELET_API_SERVER="--api-servers="
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""
设置开机启动、开启服务
[root@k8s_client1~]# systemctl enable kubelet kube-proxy
[root@k8s_client1~]# systemctl start kubelet kube-proxy
查看端口:
[root@k8s_client1~]# netstat–ntlp
Active Internet connections(only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1277/master
tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 3246/kubelet
tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 3133/kube-proxy
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 575/rpcbind
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1332/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1000/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 998/cupsd
tcp6 0 0::1:25 :::* LISTEN 1277/master
tcp6 0 0:::4194 :::* LISTEN 3246/kubelet
tcp6 0 0:::10250 :::* LISTEN 3246/kubelet
tcp6 0 0:::10255 :::* LISTEN 3246/kubelet
tcp6 0 0:::111 :::* LISTEN 575/rpcbind
tcp6 0 0:::22 :::* LISTEN 1000/sshd
tcp6 0 0::1:631 :::* LISTEN 998/cupsd
Master上查看集群中的节点及节点状态
[root@k8s-master kubernetes]# kubectl get node
NAME STATUS AGE
192.168.248.142 Ready 2m
[root@k8s-master kubernetes]# kubectl-s get node
NAME STATUS AGE
192.168.248.142 Ready 2m
kubernetes集群搭建完成。
在k8s集群中创建pod,如果出现如下错误
其中最主要的问题是:details:(open/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)
解决方案:
查看/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt(该链接就是上图中的说明)是一个软链接,但是链接过去后并没有真实的/etc/rhsm,所以需要使用yum安装:
yum install*rhsm*
安装完成后,执行一下docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
如果依然报错,可参考下面的方案:
wget
rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm| cpio-iv--to-stdout./etc/rhsm/ca/redhat-uep.pem| tee/etc/rhsm/ca/redhat-uep.pem
注释:rpm2cpio命令用于将rpm软件包转换为cpio格式的文件
cpio命令主要是用来建立或者还原备份档的工具程序,cpio命令可以复制文件到归档包中,或者从归档包中复文件。
-i 还原备份档
-v 详细显示指令的执行过程
这两个命令会生成/etc/rhsm/ca/redhat-uep.pem文件.
[root@k8s-node~]# docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
在master节点新建pod并查看起状态为正常
flannel是CoreOS提供用于解决Dokcer集群跨主机通讯的覆盖网络工具。它的主要思路是:预先留出一个网段,每个主机使用其中一部分,然后每个容器被分配不同的ip;让所有的容器认为大家在同一个直连的网络,底层通过UDP/VxLAN等进行报文的封装和转发。
服务器开启了iptables,导致无法跨网段访问其他IP地址
lo这个网卡不是你本机连接其他网段的ip的主机的网卡吧?
你这里在最后有一条-A INPUT-j DROP的规则,就是说除了上面放行的规则之外全部通过INPUT链的报文都将被丢弃。
你的本机想要访问其他跨网段的ip一定要通过路由,而通过INPUT链的报文被丢弃之后你要访问的机器就无法把响应报文发送给你本机(因为被丢弃了),所以导致无法访问。
解决方法是可以把要访问的这些ip地址或ip地址段添加白名单规则的方式加入防火墙规则中。
例如:iptables-I INPUT-p tcp-s 192.168.1.100-j ACCEPT
Docker容器跨主机通信之:直接路由方式
就目前Docker自身默认的网络来说,单台主机上的不同Docker容器可以借助docker0网桥直接通信,这没毛病,而不同主机上的Docker容器之间只能通过在主机上用映射端口的方法来进行通信,有时这种方式会很不方便,甚至达不到我们的要求,因此位于不同物理机上的Docker容器之间直接使用本身的IP地址进行通信很有必要。再者说,如果将Docker容器起在不同的物理主机上,我们不可避免的会遭遇到Docker容器的跨主机通信问题。本文就来尝试一下。
如下图所示,我们有两个物理主机1和主机2,我们在各自宿主机上启动一个centos容器,启动成功之后,两个容器分别运行在两个宿主机之上,默认的IP地址分配如图所示,这也是Docker自身默认的网络。
此时两台主机上的Docker容器如何直接通过IP地址进行通信?
一种直接想到的方案便是通过分别在各自主机中添加路由来实现两个centos容器之间的直接通信。我们来试试吧
由于使用容器的IP进行路由,就需要避免不同主机上的容器使用了相同的IP,为此我们应该为不同的主机分配不同的子网来保证。于是我们构造一下两个容器之间通信的路由方案,如下图所示。
各项配置如下:
这样配置之后,两个主机上的Docker容器就肯定不会使用相同的IP地址从而避免了IP冲突。
我们接下来定义两条路由规则即可:
综上所述,数据包在两个容器间的传递过程如下:
我们心里方案想的是这样,接下来实践一下看看是否可行。
编辑主机1上的/etc/docker/daemon.json文件,添加内容:"bip":"ip/netmask"
编辑主机2上的/etc/docker/daemon.json文件,添加内容:"bip":"ip/netmask"
主机1和主机2上均执行如下命令重启docker服务以使修改后的docker0网段生效
主机1上添加路由规则如下:
主机2上添加路由规则如下:
主机1上添加如下规则:
主机2上添加如下规则:
主机1上启动centos容器:
主机2上启动centos容器:
好了,现在两容器可以互ping了