Kuebernetes网络管理
本章用到的资源请访问下面的网址:
https://download.csdn.net/download/weixin_54373617/18444746
资源配置
系统 | 主机名 | IP | 配置 |
---|---|---|---|
centos 7.9 | master | 192.168.10.106 | 2C 4G |
centos 7.9 | node1 | 192.168.10.107 | 2C 4G |
centos 7.9 | node2 | 192.168.10.108 | 2C 4G |
基础环境
-
所有节点修改为对应的主机名
master节点
[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# su
[root@master ~]#
node1节点
[root@localhost ~]# hostnamectl set-hostname node1
[root@localhost ~]# su
[root@node1 ~]#
node2节点
[root@localhost ~]# hostnamectl set-hostname node2
[root@localhost ~]# su
[root@node2 ~]# -
所以节点关闭防火墙
systemctl stop firewalld
systemctl disable firewalld -
所以节点关闭selinux
sed -i “s/^SELINUX=*/SELINUX=disabled/g” /etc/selinux/config
setenforce 0 -
所以节点关闭swap
swapoff -a # 临时关闭
vim /etc/fstab 注释掉swap那一行 # 永久关闭之后要重启服务器
#永久关闭swap交换分区
-
所有节点重启服务器
init 6
或
reboot -
所有节点添加主机名与IP对应关系
-
将桥接的IPv4流量传递到iptables的链(所有机器执行)
[root@master ~]# sysctl --system
-
所有节点安装docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
启动服务
systemctl start docker
systemctl enable docker
配置加速,并设置驱动
画横线的加速地址可以换成自己的加速地址,这里用的是我自己的阿里镜像源的加速地址
进入阿里云官网登录后——控制台——搜索框搜索“容器镜像服务”——镜像工具——选择centos的镜像加速地址
这样就能找到自己的镜像加速地址了
加载daemon并重启docker
systemctl daemon-reload
systemctl restart docker -
所有节点添加阿里云YUM源
-
所有节点安装kubeadm,kubelet和kubectl
yum install -y kubelet-1.16.0 kubeadm-1.16.0 kubectl-1.16.0
systemctl start kubelet
systemctl enable kubelet
部署
初始化master节点
#只在master节点执行
#由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
还有一种办法是直接把下载好的镜像上传到服务器中,然后在导入到docker中这样就很快了
然后再用for循环执行一下
[root@master images]# for i in $(ls); do docker load < $i; done
#执行成功以后最后结果会输出
红:master节点ip
黄:kubernetes版本
蓝:service的IP范围,集群内容器的IP范围
绿:pod的IP地址范围
执行成功以后最后几行结果会输出以下信息,第一个是master节点执行的命令
第二个是node节点加入集群使用的,把这个命令复制粘贴到需要加入群集的节点执行就行了(这里每个人生成的都不一样,按照自己生成的执行)
查看节点状态,现在是NotReady状态
安装Pod网络插件(CNI)
上传写好的yaml文件
kubectl apply -f calico-3.13.1.yaml
查看节点信息
网络插件安装好之后每个节点状态都是Ready状态了。
创建命名空间
命令格式:
kubectl create ns 名字
[root@master ~]# kubectl create ns policy-demo
查看所有命名空间
查看命名空间
命令格式:
kubectl get ns 名字
在命名空间中创建副本
命令格式:
kubectl run --namespace=命名空间名字 副本名 --replicas=副本数 --image=镜像名
在 policy-demo 命名空间中创建两个副本的 Nginx Pod
首先先上传nginx镜像到服务中,然后在上传到docker中,也可以不用上传,会自动联网获取的
[root@master ~]# docker load < nginx.tar
[root@master ~]# kubectl run --namespace=policy-demo nginx --replicas=2 --image=nginx
查看所属命名空间的pod
命令格式:
kubectl get pod -n 命名空间名
查看所有pod所属的命名空间
kubectl get pod --all-namespaces(命名空间)
查看所有pod所属的命名空间并且查看都在哪些节点上运行
kubectl get pod --all-namespaces -o wide
查看所属命名空间中某个pod的ip和具体在哪个几点运行
命令格式:
kubectl get pod -n 命名空间名 pod名字 -o wide
kubectl get pod -n policy-demo nginx-6db489d4b7-tdds7 -o wide
通过服务(service)暴露 Nginx 的 80 端口
命令格式:
kubectl expose --namespace=命名空间名 deployment 服务名 --port=80
查看服务的详细信息,显示了服务名称,类型,集群ip,端口,时间等信息
命令格式:
kubectl get service(可简写为svc) -n 命名空间名
注意:如果只执行 kubectl get svc 查看的是默认的命名空间default,所以一般执行时都要跟上所属的名空间名
创建一个临时的pod服务访问nginx
命令格式:
kubectl run --namespace=命名空间名 access --rm -ti --image busybox /bin/sh
–rm:临时的
busybox:里面有很多测试的工具的一个镜像
通过 busybox 的 Pod 去访问 Nginx 服务
[root@master ~]# kubectl run --namespace=policy-demo access --rm -ti --image busybox /bin/sh
访问nginx服务的
wget -q nginx -O -
显示nginx能在集群内访问了
注意:这里我们一旦exit退出这个环境后这个环境也就不存在了,因为时临时的,所以后续测试时可继续创建用来测试
在policy-demo命名空间中打开隔离,该策略将对policy-demo名称空间中的所有Pod实现默认的拒绝行为。
kind: 类型
apiVersion: api版本
metadata: 元数据信息
name: 默认拒绝
namespace:: 命名空间名字
spec: 规格
podSelector: pod选择器
matchLabels: {} 括号里面什么都没写表示所有的都拒绝
写完策略后在访问policy-demo名称空间中的nginx服务就timed out(超时了)
现在,使用NetworkPolicy启用对nginx服务的访问。这将允许从accessPod 传入的连接,但不能从其他任何地方传入
首先要先查看一下nginx匹配的标签
命令格式:
kubectl get pod -n 命名空间名 --show-labels
matchLabels:匹配标签,我们前面查看到nginx匹配的标签时run
access-nginx:允许访问nginx
spec:规格
ingress:进入
在所属命名空间内又可以访问nginx了
删除命名空间
kubectl delete ns policy-demo
如果想删除其他的直接
kubectl delete 其他
Calico 网络策略进阶
创建新的命名空间 advanced-policy-demo
kubectl create ns advanced-policy-demo
使用yaml文件创建nginx,注意修改yaml文件里的namespace
首先上传yaml文件到服务器中
然后编辑yaml文件
kubectl apply -f nginx-deployment.yaml
通过服务暴露 Nginx 的 80 端口
kubectl expose --namespace=advanced-policy-demo deployment nginx --port=80
验证访问权限并访问百度测试外网连通性
wget -q --timeout=5 nginx -O -
wget -q --timeout=5 www.baidu.com -O -
验证结果是都可以访问到
拒绝所有入口流量
kubectl run --namespace=advanced-policy-demo access --rm -ti --image busybox /bin/sh
wget -q --timeout=5 nginx -O -
wget -q --timeout=5 www.baidu.com -O -
验证结果是不能访问nginx了,但可以正常访问baidu
允许进入 Nginx 的流量
执行以下命令,创建一个 NetworkPolicy,设置允许流量从 advanced-policy-demo 命 名空间中的任何 Pod 到 Nginx Pod。创建策略成功后,就可以访问 Nginx 服务了
kubectl run --namespace=advanced-policy-demo access --rm -ti --image busybox /bin/sh
wget -q --timeout=5 nginx -O -
wget -q --timeout=5 www.baidu.com -O -
验证结果是都可以访问到
拒绝所有出口流量
设置拒绝所有出口流量的网络策略,该策略设置成功后,任何策略未明确允许的入站或出站流量都将被拒绝
wget -q --timeout=5 nginx -O -
wget -q --timeout=5 www.baidu.com -O -
验证结果是都不能访问了
允许 DNS 出口流量
在 kube-system 名称空间上创建一个标签。该标签的 NetworkPolicy 允许 DNS 从 advanced-policy-demo 名称空间中的任何 Pod 到名称空间 kube-system 的出 站流量
kubectl label namespace kube-system name=kube-system
使用nslookup可以看到nginx的服务ip和端口
即使 DNS 出口流量被允许,但来自 advanced-policy-demo 命名空间中所有 Pod 的所 有其他出口流量仍被阻止。因此,来自 wget 调用的 HTTP 出口流量仍将失败。
允许出口流量到 Nginx
创建一个 NetworkPolicy,允许从 advanced-policy-demo 名称空间中 的任何 Pod 到具有 app: nginx 相同名称空间中标签匹配的 Pod 的出站流量
kubectl run --namespace=advanced-policy-demo access --rm -ti --image busybox /bin/sh
wget -q --timeout=5 nginx -O -
验证结果可以访问到