理论基础

image.png
认证:
如上图步骤 1 所示,建立 TLS 后, HTTP 请求将进入认证(Authentication)步骤。认证模块包含客户端证书、密码、普通令牌、引导令牌等。可以指定多个认证模块,在这种情况下,服务器依次尝试每个验证模块,直到其中一个成功。

授权:
如上图的步骤 2 所示,将请求验证为来自特定的用户后,请求必须被鉴权。
请求必须包含请求者的用户名、请求的行为以及受该操作影响的对象。 如果现有策略声明用户有权完成请求的操作,那么该请求被鉴权通过。

准入控制:
如上图的步骤 3 所示,准入控制模块是可以修改或拒绝请求的软件模块。 除鉴权模块可用的属性外,准入控制模块还可以访问正在创建或修改的对象的内容。

Kubernetes中的账户

Kubernetes的账户类型有两种:User Account和Service Account

User Account

理论基础

User Account是给使用人员用的,用于与API Server交互进行集群操作与管理。

使用HTTP 请求kubernetes API:

  1. [root@clientvm ~]# kubectl proxy --port=8080
  2. Starting to serve on 127.0.0.1:8080
  3. [root@clientvm ~]# curl http://localhost:8080/api/v1/namespaces
  4. {
  5. "kind": "NamespaceList",
  6. "apiVersion": "v1",
  7. "metadata": {
  8. "selfLink": "/api/v1/namespaces",
  9. "resourceVersion": "3866057"
  10. },
  11. [root@clientvm ~]# curl http://localhost:8080/apis/apps/v1/namespaces/kube-system/deployments
  12. {
  13. "kind": "DeploymentList",
  14. "apiVersion": "apps/v1",
  15. "metadata": {
  16. "selfLink": "/apis/apps/v1/namespaces/kube-system/deployments",
  17. "resourceVersion": "3870674"
  18. },
  19. "items": [
  20. {
  21. "metadata": {
  22. "name": "coredns",

Kubernetes 使用身份认证插件利用客户端证书、持有者令牌(Bearer Token)、身份认证代理(Proxy) 或者 HTTP 基本认证机制来认证 API 请求的身份。

X509客户端证书认证

为了让普通用户能够通过认证并调用 API,需要执行一下几个步骤。
首先,该用户必须拥有 Kubernetes 集群签发的证书, 然后将该证书作为 API 调用的 Certificate 头或通过 kubectl 提供。
1) 创建私钥

  1. [root@clientvm ~]# openssl genrsa -out user1.key 2048

2) 创建CSR

  1. openssl req -new -key user1.key -out user1.csr -subj "/CN=user1/O=kubernetes"

注: 以下步骤为使用CA证书签名,如果无法访问CA证书,也可以替换为步骤3、4直接使用在集群中签名,任选其一

  1. ## SCP user1.csr到master节点
  2. [root@clientvm ~]# scp user1.csr master:/etc/kubernetes/pki/
  3. ## 登录到master节点,签名证书
  4. [root@master pki]# pwd
  5. /etc/kubernetes/pki
  6. [root@master pki]# openssl x509 -req -in user1.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out user1.crt
  7. ## 将生成的crt证书 copy 回clientvm
  8. [root@master pki]# scp user1.crt clientvm:/root/

3) 证书签名

  1. [root@clientvm ~]# cat user1.csr | base64 | tr -d "\n"

替换入下文件中的request内容

  1. [root@clientvm ~]# cat user1-csr.yaml
  2. apiVersion: certificates.k8s.io/v1
  3. kind: CertificateSigningRequest
  4. metadata:
  5. name: user1
  6. spec:
  7. groups:
  8. - system:authenticated
  9. request: NEED TO REPLACE
  10. signerName: kubernetes.io/kube-apiserver-client
  11. usages:
  12. - client auth

4)签名,获取证书

  1. [root@clientvm ~]# kubectl apply -f user1-csr.yaml
  2. certificatesigningrequest.certificates.k8s.io/user1 created
  3. [root@clientvm ~]# kubectl get csr
  4. NAME AGE SIGNERNAME REQUESTOR CONDITION
  5. user1 18s kubernetes.io/kube-apiserver-client kubernetes-admin Pending
  6. [root@clientvm ~]# kubectl certificate approve user1
  7. certificatesigningrequest.certificates.k8s.io/user1 approved
  8. [root@clientvm ~]# kubectl get csr/user1 -o yaml
  9. ## 证书的内容使用 base64 编码,存放在字段 status.certificate

保存status.certificate内容到一个文件aaa,生成证书 crt

  1. [root@clientvm ~]# cat aaa |base64 --decode >user1.crt

5) 添加user1到kubeconfig

  1. [root@clientvm ~]# kubectl config set-credentials user1 --client-key=user1.key --client-certificate=user1.crt --embed-certs=true
  2. User "user1" set.

6) 添加上下文

  1. [root@clientvm ~]# kubectl config get-contexts
  2. CURRENT NAME CLUSTER AUTHINFO NAMESPACE
  3. * kubernetes-admin@kubernetes kubernetes kubernetes-admin
  4. [root@clientvm ~]# kubectl config set-context user1@kubernetes --cluster=kubernetes --user=user1
  5. Context "user1@kubernetes" created.

7) 把上下文切换为user1

  1. [root@clientvm ~]# kubectl config use-context user1@kubernetes
  2. Switched to context "user1@kubernetes".
  3. ##此处报权限错误是因为只做了认证,还没有授权
  4. [root@clientvm ~]# kubectl get pod
  5. Error from server (Forbidden): pods is forbidden: User "user1" cannot list resource "pods" in API group "" in the namespace "default"

管理配置上下文

基本步骤
1) 添加用户

  1. kubectl config set-credentials -h

2) 添加 cluster

  1. kubectl config set-cluster -h

3) 添加 context

  1. kubectl config set-context

4) 切换使用

  1. [root@clientvm ~]# kubectl config current-context
  2. kubernetes-admin@kubernetes
  3. [root@clientvm ~]# kubectl config use-context kubernetes-admin@kubernetes
  4. Switched to context "kubernetes-admin@kubernetes".
  5. [root@clientvm ~]# kubectl config get-contexts
  6. CURRENT NAME CLUSTER AUTHINFO NAMESPACE
  7. * kubernetes-admin@kubernetes kubernetes kubernetes-admin
  8. user1@kubernetes kubernetes user1

Service Account

当你(自然人)访问集群时(例如,使用 kubectl),API 服务器将你的身份验证为 特定的用户帐户(当前这通常是 admin,除非你的集群管理员已经定制了你的集群配置)。 Pod 内的容器中的进程也可以与 api 服务器接触。 当它们进行身份验证时,它们被验证为特定的服务帐户(例如,default

服务账号通常由 API 服务器自动创建并通过 ServiceAccount 准入控制器 关联到集群中运行的 Pod 上。 相关Token会挂载到 Pod 中可预知的位置,允许集群内进程与 API 服务器通信。

当你创建 Pod 时,如果没有指定服务账户,Pod 会被指定给命名空间中的 default 服务账户。 也可以在Pod中添加serviceAccountName明确指定SA。

  1. [root@clientvm ~]# kubectl get pod nginx2 -o yaml | grep -i serviceaccount
  2. - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
  3. serviceAccount: default
  4. serviceAccountName: default

创建SA:

  1. [root@clientvm ~]# kubectl create serviceaccount -h
  2. Create a service account with the specified name.
  3. Aliases:
  4. serviceaccount, sa
  5. Examples:
  6. # Create a new service account named my-service-account
  7. kubectl create serviceaccount my-service-account

创建SA后,系统会自动创建一个token

  1. [root@clientvm ~]# kubectl get sa,secret -n mytest
  2. NAME SECRETS AGE
  3. serviceaccount/default 1 18d
  4. serviceaccount/my-sa 1 15s
  5. NAME TYPE DATA AGE
  6. secret/default-token-64sch kubernetes.io/service-account-token 3 18d
  7. secret/my-sa-token-w6d7f kubernetes.io/service-account-token 3 15s
  1. [root@clientvm ~]# kubectl get serviceaccounts my-sa -n mytest -o yaml
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5. creationTimestamp: "2020-12-16T05:24:27Z"
  6. name: my-sa
  7. namespace: mytest
  8. resourceVersion: "4060881"
  9. selfLink: /api/v1/namespaces/mytest/serviceaccounts/my-sa
  10. uid: 85bd0753-5ebf-4c5f-8046-5dbd4391f739
  11. secrets:
  12. - name: my-sa-token-w6d7f

从私有镜像仓库获取镜像
Option 1) 在Pod中引 ImagePullSecrets

  1. # pod.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: foo
  6. namespace: awesomeapps
  7. spec:
  8. containers:
  9. - name: foo
  10. image: janedoe/awesomeapp:v1
  11. imagePullSecrets:
  12. - name: myregistryke

Option 2)添加 docker-registry 类似的secret到default SA

  1. kubectl create secret docker-registry myregistrykey --docker-server=DUMMY_SERVER \
  2. --docker-username=DUMMY_USERNAME --docker-password=DUMMY_DOCKER_PASSWORD
  3. kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'

RBAC授权

基于角色(Role)的访问控制(RBAC)是一种基于组织中用户的角色来调节控制对 计算机或网络资源的访问的方法。

RBAC 鉴权机制使用 rbac.authorization.k8s.io API 组 来驱动鉴权决定,允许你通过 Kubernetes API 动态配置策略。

要启用 RBAC,在启动 API 服务器 时将 --authorization-mode 参数设置为一个逗号分隔的列表并确保其中包含 RBAC

RBAC API 声明了四种 Kubernetes 对象:RoleClusterRoleRoleBindingClusterRoleBinding

Role 和 ClusterRole

RBAC 的 RoleClusterRole 中包含一组代表相关权限的规则。 这些权限是纯粹累加的(不存在拒绝某操作的规则)。

Role 总是用来在某个名字空间 内设置访问权限;在你创建 Role 时,你必须指定该 Role 所属的名字空间。
与之相对,ClusterRole 则是一个集群作用域的资源。这两种资源的名字不同(Role 和 ClusterRole)是因为 Kubernetes 对象要么是名字空间作用域的,要么是集群作用域的, 不可两者兼具。

如果你希望在名字空间内定义角色,应该使用 Role; 如果你希望定义集群范围的角色,应该使用 ClusterRole。

role可包含的操作有:

  1. "get", "list", "watch", "create", "update", "patch", "delete"

role常用可操作资源有:Pods, ConfigMaps, Deploments, Nodes, Secrets, Namespaces

核心组件角色

默认 ClusterRole 默认 ClusterRoleBinding 描述
cluster-admin system:masters 允许超级用户在平台上的任何资源上执行所有操作。 当在 ClusterRoleBinding 中使用时,可以授权对集群中以及所有名字空间中的全部资源进行完全控制。 当在 RoleBinding 中使用时,可以授权控制 RoleBinding 所在名字空间中的所有资源,包括名字空间本身。
admin 允许管理员访问权限,旨在使用 RoleBinding 在名字空间内执行授权。 如果在 RoleBinding 中使用,则可授予对名字空间中的大多数资源的读/写权限, 包括创建角色和角色绑定的能力。 但是它不允许对资源配额或者名字空间本身进行写操作。
edit 允许对名字空间的大多数对象进行读/写操作。 它不允许查看或者修改角色或者角色绑定。 不过,此角色可以访问 Secret,以名字空间中任何 ServiceAccount 的身份运行 Pods, 所以可以用来了解名字空间内所有服务账号的 API 访问级别。

Role范例:

  1. [root@clientvm ~]# kubectl create role -h
  2. Usage:
  3. kubectl create role NAME --verb=verb --resource=resource.group/subresource [--resource-name=resourcename]
  4. [--dry-run=server|client|none] [options]
  5. Examples:
  6. # Create a Role named "pod-reader" that allows user to perform "get", "watch" and "list" on pods
  7. kubectl create role pod-reader --verb=get --verb=list --verb=watch --resource=pods
  8. # Create a Role named "pod-reader" with ResourceName specified
  9. kubectl create role pod-reader --verb=get --resource=pods --resource-name=readablepod --resource-name=anotherpod
  10. # Create a Role named "foo" with API Group specified
  11. kubectl create role foo --verb=get,list,watch --resource=rs.extensions
  12. # Create a Role named "foo" with SubResource specified
  13. kubectl create role foo --verb=get,list,watch --resource=pods,pods/status
  1. [root@clientvm ~]# cat role-example.yaml
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. kind: Role
  4. metadata:
  5. namespace: mytest
  6. name: pod-reader
  7. rules:
  8. - apiGroups: [""] # "" 标明 core API 组
  9. resources: ["pods"]
  10. verbs: ["get", "watch", "list"]
  11. [root@clientvm ~]# kubectl apply -f role-example.yaml
  12. role.rbac.authorization.k8s.io/pod-reader created

ClusterRole范例

  1. [root@clientvm ~]# kubectl create clusterrole -h
  2. Usage:
  3. kubectl create clusterrole NAME --verb=verb --resource=resource.group [--resource-name=resourcename]
  4. [--dry-run=server|client|none] [options]
  5. Examples:
  6. # Create a ClusterRole named "pod-reader" that allows user to perform "get", "watch" and "list" on pods
  7. kubectl create clusterrole pod-reader --verb=get,list,watch --resource=pods
  8. # Create a ClusterRole named "pod-reader" with ResourceName specified
  9. kubectl create clusterrole pod-reader --verb=get --resource=pods --resource-name=readablepod
  10. --resource-name=anotherpod
  11. # Create a ClusterRole named "foo" with API Group specified
  12. kubectl create clusterrole foo --verb=get,list,watch --resource=rs.extensions
  13. # Create a ClusterRole named "foo" with SubResource specified
  14. kubectl create clusterrole foo --verb=get,list,watch --resource=pods,pods/status
  15. # Create a ClusterRole name "foo" with NonResourceURL specified
  16. kubectl create clusterrole "foo" --verb=get --non-resource-url=/logs/*
  17. # Create a ClusterRole name "monitoring" with AggregationRule specified
  18. kubectl create clusterrole monitoring --aggregation-rule="rbac.example.com/aggregate-to-monitoring=true"
  1. [root@clientvm ~]# cat clusterrole-example.yaml
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. kind: ClusterRole
  4. metadata:
  5. name: secret-reader
  6. rules:
  7. - apiGroups: [""]
  8. # 在 HTTP 层面,用来访问 Secret 对象的资源的名称为 "secrets"
  9. resources: ["secrets"]
  10. verbs: ["get", "watch", "list"]
  11. [root@clientvm ~]# kubectl apply -f clusterrole-example.yaml
  12. clusterrole.rbac.authorization.k8s.io/secret-reader created
  1. [root@clientvm ~]# kubectl get role -n mytest
  2. NAME CREATED AT
  3. pod-reader 2020-12-16T04:41:56Z
  4. [root@clientvm ~]# kubectl get clusterrole | grep secret
  5. secret-reader 2020-12-16T04:44:26Z

RoleBinding 和 ClusterRoleBinding

角色绑定(Role Binding)是将角色中定义的权限赋予一个或者一组用户。RoleBinding 在指定的名字空间中执行授权,而 ClusterRoleBinding 在集群范围执行授权。

一个 RoleBinding 可以引用同一的名字空间中的任何 Role。 或者,一个 RoleBinding 可以引用某 ClusterRole 并将该 ClusterRole 绑定到 RoleBinding 所在的名字空间。 如果你希望将某 ClusterRole 绑定到集群中所有名字空间,你要使用 ClusterRoleBinding。

RoleBinding 范例

  1. [root@clientvm ~]# kubectl create rolebinding -h
  2. Usage:
  3. kubectl create rolebinding NAME --clusterrole=NAME|--role=NAME [--user=username] [--group=groupname]
  4. [--serviceaccount=namespace:serviceaccountname] [--dry-run=server|client|none] [options]
  5. Examples:
  6. # Create a RoleBinding for user1, user2, and group1 using the admin ClusterRole
  7. kubectl create rolebinding admin --clusterrole=admin --user=user1 --user=user2 --group=group1

将clusterrole admin 绑定到之前创建的user account user1

  1. [root@clientvm ~]# kubectl create rolebinding admin-to-user1 --clusterrole=admin --user=user1
  2. rolebinding.rbac.authorization.k8s.io/admin-to-user1 created
  3. [root@clientvm ~]# kubectl --context=user1 get pod
  4. NAME READY STATUS RESTARTS AGE
  5. nginx-taint 1/1 Running 0 37h
  6. nginx2 1/1 Running 0 4d20h

ClusterRoleBinding 范例

  1. [root@clientvm ~]# kubectl create clusterrolebinding -h
  2. Usage:
  3. kubectl create clusterrolebinding NAME --clusterrole=NAME [--user=username] [--group=groupname]
  4. [--serviceaccount=namespace:serviceaccountname] [--dry-run=server|client|none] [options]
  5. Examples:
  6. # Create a ClusterRoleBinding for user1, user2, and group1 using the cluster-admin ClusterRole
  7. kubectl create clusterrolebinding cluster-admin --clusterrole=cluster-admin --user=user1 --user=user2 --group=group1

准入控制(Admission Controllers)

英文:
https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#what-does-each-admission-controller-do

中文:
https://kubernetes.io/zh/docs/reference/access-authn-authz/admission-controllers/
启用额外的准入控制器:

  1. [root@master manifests]# grep admission ./kube-apiserver.yaml
  2. - --enable-admission-plugins=NodeRestriction

关闭准入控制器:

  1. ## 添加如下参数
  2. --disable-admission-plugins=PodNodeSelector,AlwaysDeny ...

默认启用的控制器:

  1. NamespaceLifecycle, LimitRanger, ServiceAccount, TaintNodesByCondition, Priority, DefaultTolerationSeconds, DefaultStorageClass, StorageObjectInUseProtection, PersistentVolumeClaimResize, RuntimeClass, CertificateApproval, CertificateSigning, CertificateSubjectRestriction, DefaultIngressClass, MutatingAdmissionWebhook, ValidatingAdmissionWebhook, ResourceQuota

网络策略

理论基础

如果你希望在 IP 地址或端口层面(OSI 第 3 层或第 4 层)控制网络流量, 则你可以考虑为集群中特定应用使用 Kubernetes 网络策略(NetworkPolicy)。 NetworkPolicy 是一种以应用为中心的结构,允许你设置如何允许 Pod 与网络上的各类网络“实体” 通信。

Pod 可以通信的 Pod 是通过如下三个标识符的组合来辩识的:

  1. 其他被允许的 Pods(例外:Pod 无法阻塞对自身的访问)
  2. 被允许的名字空间
  3. IP 组块(例外:与 Pod 运行所在的节点的通信总是被允许的, 无论 Pod 或节点的 IP 地址)

在定义基于 Pod 或名字空间的 NetworkPolicy 时,你会使用 选择算符 来设定哪些流量 可以进入或离开与该算符匹配的 Pod。 当基于 IP 的 NetworkPolicy 被创建时,我们基于 IP 组块(CIDR 范围) 来定义策略。

网络策略通过网络插件 来实现。要使用网络策略,你必须使用支持 NetworkPolicy 的网络解决方案。

语法说明

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: test-network-policy
  5. namespace: default
  6. spec:
  7. podSelector:
  8. matchLabels:
  9. role: db
  10. ##1)对default NameSpace中包含标签role=db的Pod做控制
  11. policyTypes:
  12. - Ingress
  13. - Egress
  14. ##2)控制出入流量,未明确指定都是拒绝
  15. ingress:
  16. - from:
  17. - ipBlock:
  18. cidr: 172.17.0.0/16
  19. except:
  20. - 172.17.1.0/24
  21. ##3)允许的网段,例外网段
  22. - namespaceSelector:
  23. matchLabels:
  24. project: myproject
  25. ##4)允许的NameSpace
  26. - podSelector:
  27. matchLabels:
  28. role: frontend
  29. ##5)允许的Pod
  30. ports:
  31. - protocol: TCP
  32. port: 6379
  33. ##6) 定义被访问的端口
  34. egress:
  35. - to:
  36. - ipBlock:
  37. cidr: 10.0.0.0/24
  38. ports:
  39. - protocol: TCP
  40. port: 5978
  41. ##7)允许要控制的Pod访问哪个 "网段:端口" 的流量

注意From和To的行为

1)表示交集,and 运算

  1. ...
  2. ingress:
  3. - from:
  4. - namespaceSelector:
  5. matchLabels:
  6. user: alice
  7. podSelector:
  8. matchLabels:
  9. role: client
  10. ...

2)表示并集,or 运算

  1. ...
  2. ingress:
  3. - from:
  4. - namespaceSelector:
  5. matchLabels:
  6. user: alice
  7. - podSelector:
  8. matchLabels:
  9. role: client
  10. ...

默认策略:拒绝所有进入流量

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: default-deny-ingress
  5. spec:
  6. podSelector: {}
  7. policyTypes:
  8. - Ingress

默认策略:允许所有进入流量

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: allow-all-ingress
  5. spec:
  6. podSelector: {}
  7. ingress:
  8. - {}
  9. policyTypes:
  10. - Ingress

范例1: 允许指定网段的入站流量

  1. [root@clientvm ~]# cat deny-all-except.yaml
  2. apiVersion: networking.k8s.io/v1
  3. kind: NetworkPolicy
  4. metadata:
  5. name: deny-ingress-except
  6. spec:
  7. podSelector:
  8. matchLabels:
  9. run: nginx1
  10. policyTypes:
  11. - Ingress
  12. ingress:
  13. - from:
  14. - ipBlock:
  15. cidr: 10.244.0.0/16
  16. except:
  17. - 10.244.102.0/24
  18. - ipBlock:
  19. cidr: 192.168.241.0/24
  20. [root@clientvm ~]#
  21. [root@clientvm ~]# kubectl get pod --show-labels -o wide
  22. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
  23. busybox 1/1 Running 0 5m23s 10.244.102.144 worker1.example.com <none> <none> run=busybox
  24. nginx1 1/1 Running 0 10h 10.244.71.195 worker2.example.com <none> <none> run=nginx1
  25. nginx2 1/1 Running 0 10h 10.244.71.196 worker2.example.com <none> <none> run=nginx2
  26. nginx3-default 1/1 Running 0 8h 10.244.102.133 worker1.example.com <none> <none> run=nginx3-
  1. [root@master ~]# ip a | grep 192
  2. inet 192.168.241.129/24 brd 192.168.241.255 scope global eth0
  3. [root@master ~]# ping 10.244.71.195
  4. PING 10.244.71.195 (10.244.71.195) 56(84) bytes of data.
  5. 64 bytes from 10.244.71.195: icmp_seq=1 ttl=63 time=0.484 ms
  6. 64 bytes from 10.244.71.195: icmp_seq=2 ttl=63 time=0.276 ms
  7. 64 bytes from 10.244.71.195: icmp_seq=3 ttl=63 time=0.217 ms
  8. ^C
  9. --- 10.244.71.195 ping statistics ---
  1. [root@clientvm ~]# kubectl run busybox --image=busybox --image-pull-policy=IfNotPresent -- sleep 10000
  2. pod/busybox created
  3. [root@clientvm ~]#
  4. [root@clientvm ~]# kubectl get pod -o wide
  5. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  6. busybox 1/1 Running 0 10s 10.244.102.144 worker1.example.com <none> <none>
  7. nginx1 1/1 Running 0 10h 10.244.71.195 worker2.example.com <none> <none>
  8. nginx2 1/1 Running 0 10h 10.244.71.196 worker2.example.com <none> <none>
  9. nginx3-default 1/1 Running 0 8h 10.244.102.133 worker1.example.com <none> <none>
  10. [root@clientvm ~]# kubectl exec busybox -it -- sh
  11. / # ping 10.244.71.195
  12. PING 10.244.71.195 (10.244.71.195): 56 data bytes
  13. ^C
  14. --- 10.244.71.195 ping statistics ---
  15. 5 packets transmitted, 0 packets received, 100% packet loss
  16. / # ping 10.244.71.196
  17. PING 10.244.71.196 (10.244.71.196): 56 data bytes
  18. 64 bytes from 10.244.71.196: seq=0 ttl=62 time=0.547 ms
  19. 64 bytes from 10.244.71.196: seq=1 ttl=62 time=0.341 ms
  20. ^C
  21. --- 10.244.71.196 ping statistics ---

范例2: 允许到指定端口的出站流量

目的:Pod Nginx1可以访问namespace内的Pod的80端口,不允许访问其他

  1. [root@clientvm ~]# cat allow-egress-to-port.yaml
  2. apiVersion: networking.k8s.io/v1
  3. kind: NetworkPolicy
  4. metadata:
  5. name: deny-ingress-except
  6. spec:
  7. podSelector:
  8. matchLabels:
  9. run: nginx1
  10. policyTypes:
  11. - Egress
  12. egress:
  13. - to:
  14. - namespaceSelector:
  15. matchLabels:
  16. app: myapp
  17. ports:
  18. - protocol: TCP
  19. port: 80

验证:

  1. [root@clientvm ~]# kubectl get pod -o wide -n mytest
  2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  3. nginxaa 1/1 Running 0 10m 10.244.71.200 worker2.example.com <none> <none>
  4. [root@clientvm ~]# kubectl get pod -o wide
  5. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  6. busybox 1/1 Running 0 33m 10.244.102.144 worker1.example.com <none> <none>
  7. nginx1 1/1 Running 0 10h 10.244.71.195 worker2.example.com <none> <none>
  1. [root@clientvm ~]# kubectl exec nginx1 -it -- bash
  2. root@nginx1:/#
  3. root@nginx1:/# curl 10.244.71.200
  4. ^C
  5. root@nginx1:/# curl 10.244.71.195
  6. AAAAAA
  7. root@nginx1:/# exit