侧边栏壁纸
博主头像
问道

问道的小花园,总能给你带来惊喜

  • 累计撰写 68 篇文章
  • 累计创建 35 个标签
  • 累计收到 6 条评论

kubernetes资源对象-网络管理:以练促学(三)

问道
2022-08-06 / 0 评论 / 0 点赞 / 484 阅读 / 3,645 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-08-06,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

引子

kubernetes的资源对象是kubernetes体系中的重要组成部分,简单理解就是生成的kubernetes的系统应用,用来调度、编排我们的业务应用。是我们的业务应用与kubernetes的kube-controller组件,如:apiserver、kube-controller、kube-scheduler等之间的中间层,起到承上启下的作用。

将kubernetes的资源对象简单的分类为以下几种资源对象:

类别名称
资源对象Pod、ReplicaSet、ReplicationController、Deployment、StatefulSet、DaemonSet、Job、CronJob、HorizontalPodAutoscaling、Node、Namespace、Service、Ingress、Label、CustomResourceDefinition
存储对象Volume、PersistentVolume、Secret、ConfigMap
策略对象SecurityContext、ResourceQuota、LimitRange
身份对象ServiceAccount、Role、ClusterRole

学习kubernetes的资源对象对入门kubernetes是十分重要的,但kubernetes的资源对象比较多,概念繁杂,容易让人困惑。

单单从理论出发,也容易让人无法留下较深的印象,故本系列直接从各种小练习出发,以练促学,在实践中加深对kubernetes资源对象的理解。同时也在实践找那个插入响应的理论讲解,理论与实践相辅相成,相符促进。

关于kubernetes的简单入门,以及搭建一个简单的kubernetes集群,百度或者其他资讯平台都有很好的教程。关注作者,私信留言(kubernetes)直接赠送。

kubernetes网络概述

Kubernetes对集群内部的网络进行了重新抽象,以实现整个集群网络扁平化。

理解kubernetes网络需要学习下面几个重要概念

Service

Service 是 Kubernetes 为屏蔽这些后端实例(Pod)的动态变化和对多实例的负载均衡而引入的资源对象。Service 通常与 deployment 绑定,定义了服务的访问入口地址,应用(Pod)可以通过这个入口地址访问其背后的一组由 Pod 副本组成的集群实例。Service 与其后端 Pod 副本集群之间则是通过 Label Selector 来实现映射。

Cluster IP和Pod IP

Pod IP 是 Kubernetes 集群中每个 Pod 的 IP 地址。它是 Docker Engine 根据 docker0网桥的IP地址段进行分配的,是一个虚拟的二层网络。Kubernetes 中 Pod 间能够彼此直接通讯,Pod 里的容器访问另外一个Pod里的容器,是通过Pod IP所在进行通信。

Cluster IP仅作用于 Service,其没有实体对象所对应,因此 Cluster IP 无法被ping通。它的作用是为 Service 后端的实例提供统一的访问入口。当访问 Cluster IP 时,请求将被转发到后端的实例上,默认是轮询方式。Cluster IP 和 Service一样由 kube-proxy 组件维护,其实现方式主要有两种,iptables 和 IPVS。

Port、nodePort和targetPort

Port非一般意义上的TCP/IP中的Port概念,它是特指Kubernetes中Service的port,是Service间的访问端口,例如Mysql的Service默认3306端口。它仅对进群内容器提供访问权限,而无法从集群外部通过该端口访问服务。

nodePort为外部机器提供了访问集群内服务的方式。比如一个Web应用需要被其他用户访问,那么需要配置type=NodePort,而且配置nodePort=30001,那么其他机器就可以通过浏览器访问scheme://node:30001访问到该服务,例如http://node:30001。

targetPort是容器的端口(最根本的端口入口),与制作容器时暴露的端口一致(DockerFile中EXPOSE),例如 http://docker.io 官方的 nginx 暴露的是80端口。

实验测试

下面进入实战环节,创建4个pod,设置不同的网路策略,并测试是或否生效。

创建4个pod

满足如下要求:
1)名字为c1和c2的pod使用busybox镜像。
2)名字为c3和c4的pod使用nginx。

busybox镜像创建时要sleep一段时间,不然是显示失败。并且复制yaml文件再apply,pod显示为confused,并不创建,虽然pod名称改了,但还是没用,估计是基于yaml,k8s认为是同一种pod,希望用deploy

#用yaml创建busybox,加上sleep命令
[root@vms31 10-net]# cat c1.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: c1
  name: c1
spec:
  containers:
  - image: busybox
    imagePullPolicy: IfNotPresent
    command:
      - sleep
      - "3600"
    name: c1
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
#第二个pod用run命令生成
[root@vms31 10-net]# kubectl run c2 --image=busybox --image-pull-policy=IfNotPresent -- 'sh' '-c' 'sleep 3600'
pod/c2 created


[root@vms31 10-net]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
c1     1/1     Running   0          13m
c2     1/1     Running   0          5m56s
c3     1/1     Running   0          19m
c4     1/1     Running   0          8m30s

创建网络策略myp1

1)此myp1应用在C3 pod上。
2)设置C3 pod只允许C1 pod访问。
3)只允许访问C3的端口80。

网络策略 修改模板为如下:

因为我们设置的是通过podSelector(标签)的方式来进行限制,所以c1需要增加标签

确认Labels添加成功

验证

[root@vms31 10-net]# kubectl label pod c3 role=frontend
pod/c3 labeled
[root@vms31 10-net]# 
[root@vms31 10-net]# 
[root@vms31 10-net]# kubectl get pod --show-labels 
NAME   READY   STATUS    RESTARTS   AGE   LABELS
c1     1/1     Running   0          23m   run=c1
c2     1/1     Running   0          16m   run=c2
c3     1/1     Running   0          30m   role=frontend,run=c3
c4     1/1     Running   0          18m   run=c4

#删除标签
kubectl label pod podname key-

创建网络策略myp2

1)此策略应用在C4 pod上。

2)设置C4 策略允许所有192.168.26.0/24网段的主机可以访问。

3)只允许访问C3的端口80。

  1. 删除这4个pod,删除这两个网络策略。

首先,还是先用模板创造一个网络策略文件,并且这次使用ipBlock的方式,它下面这个不对,except排除的不在cidr的范围内

myp2的网络策略yaml

[root@vms31 10-net]# cat myp2.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: myp2
  namespace: 10-net
spec:
  podSelector:
    matchLabels:
      run: c4
  policyTypes:
  - Ingress
  ingress:
  - from:
    - ipBlock: 
        cidr: 10.244.0.0/16
    ports:
    - protocol: TCP
      port: 80

符合网段要求的pod可以访问到c4pod

更换myp2的网络策略,只允许29网段的访问

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: myp2
  namespace: 10-net
spec:
  podSelector:
    matchLabels:
      run: c4
  policyTypes:
  - Ingress
  ingress:
  - from:
    - ipBlock:
        cidr: 10.244.29.0/24
    ports:
    - protocol: TCP
      port: 80

符合网段要求的c2还是能够请求到c4,下载时有重复文件就删除

不符合网段要求的c1无法连接上

0

评论区