• 【无标题】


    Service介绍

    在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。

    为了解决这个问题,kubernetes提供了Service资源,Service会对提供同一个服务的多个pod进行聚合,并且提供一个统一的入口地址。通过访问Service的入口地址就能访问到后面的pod服务

    Kubernetes Service定义了这样一种抽象:逻辑上的一组Pod,一种可以访问它们的策略 —— 通常被称为微服务。这一组Pod能够被Service访问到,通常是通过selector实现的。
    举个例子,考虑一个图片处理后端,它运行了3个副本。这些副本是可互换的——前端不需要关心它们调用了哪个后端副本。然而组成这一组后端程序的Pod实际上可能会发生变化,前端客户端不应该也没必要知道,而且也不需要跟踪这一组后端的状态。Service定义的抽象能够解耦这种关联。

    Service可以提供负载均衡的能力,但是使用上存在如下限制:

    只能提供4层负载均衡能力,而没有7层功能。有时我们可能需要更多的匹配规则来转发请求,这点上4层负载均衡是不支持的
    如web访问的service服务示例图

    VIP和Service代理

    在 Kubernetes 集群中,每个 Node 运行一个 kube-proxy 进程。kube-proxy 负责为 Service 实现了一种 VIP(虚拟 IP)的形式,而不是 ExternalName 的形式。

    从Kubernetes v1.0开始,已经可以使用 userspace代理模式。Kubernetes v1.1添加了 iptables 代理模式,在 Kubernetes v1.2 中kube-proxy 的 iptables 模式成为默认设置。Kubernetes v1.8添加了 ipvs 代理模式。

    为什么不使用 DNS 轮询?

    原因如下:

    • DNS 实现的历史由来已久,它不遵守记录 TTL,并且在名称查找到结果后会对其进行缓存。
    • 有些应用程序仅执行一次 DNS 查找,并无限期地缓存结果。
    • 即使应用和库进行了适当的重新解析,DNS 记录上的 TTL 值低或为零也可能会给 DNS 带来高负载,从而使管理变得困难。
      总之就是因为有缓存,因此不合适。

    Service在很多情况下只是一个概念,真正起作用的其实是kube-proxy服务进程,每个Node节点上都运行着一个kube-proxy服务进程。当创建Service的时候会通过api-server向etcd写入创建的service的信息,而kube-proxy会基于监听的机制发现这种Service的变动,然后它会将最新的Service信息转换成对应的访问规则

    1. # 192.168.170.138:80 是service提供的访问入口
    2. # 当访问这个入口的时候,可以发现后面有三个pod的服务在等待调用,
    3. # kube-proxy会基于rr(轮询)的策略,将请求分发到其中一个pod上去
    4. # 这个规则会同时在集群内的所有节点上都生成,所以在任何一个节点上访问都可以。
    5. [root@node1 ~]# ipvsadm -Ln
    6. [root@node1 ~]# ipvsadm -Ln
    7. IP Virtual Server version 1.2.1 (size=4096)
    8. Prot LocalAddress:Port Scheduler Flags
    9. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
    10. TCP 192.168.170.138:30318 rr
    11. -> 10.244.1.6:80 Masq 1 0 0
    12. TCP 10.96.0.1:443 rr
    13. -> 192.168.170.135:6443 Masq 1 1 0
    14. TCP 10.96.0.10:53 rr
    15. -> 10.244.0.6:53 Masq 1 0 0
    16. -> 10.244.0.7:53 Masq 1 0 0

    kube-proxy目前支持三种工作模式:

    userspace 模式

    userspace模式下,kube-proxy会为每一个Service创建一个监听端口,发向Cluster IP的请求被Iptables规则重定向到kube-proxy监听的端口上,kube-proxy根据LB算法选择一个提供服务的Pod并和其建立链接,以将请求转发到Pod上。 该模式下,kube-proxy充当了一个四层负责均衡器的角色。由于kube-proxy运行在userspace中,在进行转发处理时会增加内核和用户空间之间的数据拷贝,虽然比较稳定,但是效率比较低

    iptables 代理模式

    这种模式,kube-proxy 会监视 Kubernetes 控制节点对 Service 对象和 Endpoints 对象的添加和移除。 对每个 Service,它会配置 iptables 规则,从而捕获到达该 Service 的 clusterIP 和端口的请求,进而将请求重定向到 Service 的一组 backend 中的某个上面。对于每个 Endpoints 对象,它也会配置 iptables 规则,这个规则会选择一个 backend 组合。

    默认的策略是,kube-proxy 在 iptables 模式下随机选择一个 backend。

    使用 iptables 处理流量具有较低的系统开销,因为流量由 Linux netfilter 处理,而无需在用户空间和内核空间之间切换。 这种方法也可能更可靠。

    如果 kube-proxy 在 iptables模式下运行,并且所选的第一个 Pod 没有响应,则连接失败。 这与userspace模式不同:在这种情况下,kube-proxy 将检测到与第一个 Pod 的连接已失败,并会自动使用其他后端 Pod 重试。

    我们可以使用 Pod readiness 探测器 验证后端 Pod 是否可以正常工作,以便 iptables 模式下的 kube-proxy 仅看到测试正常的后端。这样做意味着可以避免将流量通过 kube-proxy 发送到已知已失败的Pod

    在 ipvs 模式下,kube-proxy监视Kubernetes服务(Service)和端点(Endpoints),调用 netlink 接口相应地创建 IPVS 规则, 并定期将 IPVS 规则与 Kubernetes服务(Service)和端点(Endpoints)同步。该控制循环可确保 IPVS 状态与所需状态匹配。访问服务(Service)时,IPVS 将流量定向到后端Pod之一。

    IPVS代理模式基于类似于 iptables 模式的 netfilter 挂钩函数,但是使用哈希表作为基础数据结构,并且在内核空间中工作。 这意味着,与 iptables 模式下的 kube-proxy 相比,IPVS 模式下的 kube-proxy 重定向通信的延迟要短,并且在同步代理规则时具有更好的性能。与其他代理模式相比,IPVS 模式还支持更高的网络流量吞吐量。

    IPVS提供了更多选项来平衡后端Pod的流量。这些是:

    • rr: round-robin
    • lc: least connection (smallest number of open connections)
    • dh: destination hashing
    • sh: source hashing
    • sed: shortest expected delay
    • nq: never queue

    注意:要在 IPVS 模式下运行 kube-proxy,必须在启动 kube-proxy 之前使 IPVS Linux 在节点上可用。 当 kube-proxy 以 IPVS 代理模式启动时,它将验证 IPVS 内核模块是否可用。 如果未检测到 IPVS 内核模块,则 kube-proxy 将退回到以 iptables 代理模式运行

    Service服务类型

    Kubernetes 中Service有以下4中类型:

    • ClusterIP:默认类型,自动分配一个仅Cluster内部可以访问的虚拟IP
    • NodePort:通过每个 Node 上的 IP 和静态端口(NodePort)暴露服务。以ClusterIP为基础,NodePort 服务会路由到 ClusterIP 服务。通过请求 :,可以从集群的外部访问一个集群内部的 NodePort 服务。
    • LoadBalancer:使用云提供商的负载均衡器,可以向外部暴露服务。外部的负载均衡器可以路由到 NodePort 服务和 ClusterIP 服务。
    • ExternalName:通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。没有任何类型代理被创建。

    需要注意的是:Service 能够将一个接收 port 映射到任意的 targetPort。默认情况下,targetPort 将被设置为与 port 字段相同的值。

    Service域名格式:$(service name).$(namespace).svc.cluster.local,其中 cluster.local 为指定的集群的域名

    Deoployment的资源清单

    1. [root@k8s-master mainfest]# vim deployment.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: pc-deployment
    6. namespace: dev
    7. spec:
    8. replicas: 3
    9. selector:
    10. matchLabels:
    11. app: nginx-pod
    12. template:
    13. metadata:
    14. labels:
    15. app: nginx-pod
    16. spec:
    17. containers:
    18. - name: nginx
    19. image: nginx:1.17.1
    20. ports:
    21. - containerPort: 80
    22. [root@k8s-master mainfest]# kubectl create -f deployment.yaml
    23. deployment.apps/deploy created
    24. # 查看pod详情
    25. [root@k8s-master mainfest]# kubectl get pods -n dev -o wide --show-labels
    26. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
    27. nginx 1/1 Running 1 7d11h 10.244.2.4 node2.example.com <none> <none> <none>
    28. pc-deployment-5ffc5bf56c-4b776 1/1 Running 0 109s 10.244.2.7 node2.example.com <none> <none> app=nginx-pod,pod-template-hash=5ffc5bf56c
    29. pc-deployment-5ffc5bf56c-ktnp8 1/1 Running 0 109s 10.244.2.8 node2.example.com <none> <none> app=nginx-pod,pod-template-hash=5ffc5bf56c
    30. pc-deployment-5ffc5bf56c-vh4f9 1/1 Running 0 109s 10.244.1.9 node1.example.com <none> <none> app=nginx-pod,pod-template-hash=5ffc5bf56c

    访问

    1. [root@k8s-master mainfest]# curl 10.244.2.7
    2. html>
    3. <html>
    4. <head>
    5. <title>Welcome to nginx!title>
    6. <style>
    7. [root@master mainfest]# curl 10.244.2.8
    8. html>
    9. <html>
    10. <head>
    11. <title>Welcome to nginx!title>
    12. <style>
    13. [root@master mainfest]# curl 10.244.1.9
    14. html>
    15. <html>
    16. <head>
    17. <title>Welcome to nginx!title>
    18. <style>

    ClusterIP类型示例

    创建cluster IP类型的service

    1. [root@k8s-master mainfest]# vim svc-clusterip.yaml
    2. apiVersion: v1
    3. kind: Service
    4. metadata:
    5. name: svc-clusterip
    6. spec:
    7. type: ClusterIP //可以不写,默认为ClusterIP
    8. selector:
    9. app: nginx
    10. ports:
    11. - name: nginx
    12. port: 80
    13. targetPort: 80
    14. [root@k8s-master mainfest]# kubectl apply -f svc-clusterip.yaml
    15. service/svc-clusterip created
    16. [root@k8s-master mainfest]# kubectl get svc
    17. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    18. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d23h
    19. svc-clusterip ClusterIP 10.105.207.162 <none> 80/TCP 2m39s

    访问

    1. [root@k8s-master mainfest]# curl 10.105.207.162
    2. html>
    3. <html>
    4. <head>
    5. <title>Welcome to nginx!title>
    6. <style>

    NodePort类型示例

    如果将 type 字段设置为 NodePort,则 Kubernetes 控制层面将在 --service-node-port-range 标志指定的范围内分配端口(默认值:30000-32767

    1. [root@k8s-master mainfest]# vim svc-nodeport.yaml
    2. apiVersion: v1
    3. kind: Service
    4. metadata:
    5. name: service-clusterip
    6. namespace: dev
    7. spec:
    8. selector:
    9. app: nginx-pod
    10. clusterIP: 10.97.97.97 # service的ip地址,如果不写,默认会生成一个
    11. type: ClusterIP
    12. ports:
    13. - port: 80 # Service端口
    14. targetPort: 80 # pod端口
    15. # 创建service
    16. [root@k8s-master mainfest]# kubectl create -f service-clusterip.yaml
    17. service/service-clusterip created
    18. # 查看service
    19. [root@k8s-master mainfest]# kubectl get svc -n dev -o wide
    20. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
    21. service-clusterip ClusterIP 10.97.97.97 <none> 80/TCP 6s app=nginx-pod
    22. # 查看service的详细信息
    23. # 在这里有一个Endpoints列表,里面就是当前service可以负载到的服务入口
    24. [root@k8s-master mainfest]# kubectl describe svc service-clusterip -n dev
    25. Name: service-clusterip
    26. Namespace: dev
    27. Labels: <none>
    28. Annotations: <none>
    29. Selector: app=nginx-pod
    30. Type: ClusterIP
    31. IP Families: <none>
    32. IP: 10.97.97.97
    33. IPs: 10.97.97.97
    34. Port: <unset> 80/TCP
    35. TargetPort: 80/TCP
    36. Endpoints: 10.244.1.9:80,10.244.2.7:80,10.244.2.8:80
    37. Session Affinity: None
    38. Events: <none>
    39. # 查看ipvs的映射规则
    40. [root@k8s-master mainfest]# ipvsadm -Ln
    41. IP Virtual Server version 1.2.1 (size=4096)
    42. Prot LocalAddress:Port Scheduler Flags
    43. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
    44. TCP 172.17.0.1:30318 rr
    45. -> 10.244.1.6:80 Masq 1 0 0
    46. TCP 192.168.122.1:30318 rr
    47. -> 10.244.1.6:80 Masq 1 0 0
    48. # 访问172.17.0.1:30318观察效果
    49. [root@k8s-master ~]# curl 172.17.0.1:30318
    50. <!DOCTYPE html>
    51. <html>
    52. <head>
    53. <title>Welcome to nginx!</title>
    54. <style>

    HeadLiness类型的Service

    在某些场景中,开发人员可能不想使用Service提供的负载均衡功能,而希望自己来控制负载均衡策略,针对这种情况,kubernetes提供了HeadLiness Service,这类Service不会分配Cluster IP,如果想要访问service,只能通过service的域名进行查询。

    创建service-headliness.yaml

    1. [root@k8s-master mainfest]# vi service-headliness.yaml
    2. apiVersion: v1
    3. kind: Service
    4. metadata:
    5. name: service-headliness
    6. namespace: dev
    7. spec:
    8. selector:
    9. app: nginx-pod
    10. clusterIP: None # 将clusterIP设置为None,即可创建headliness Service
    11. type: ClusterIP
    12. ports:
    13. - port: 80
    14. targetPort: 80
    15. # 创建service
    16. [root@k8s-master mainfest]# kubectl create -f service-headliness.yaml
    17. service/service-headliness created
    18. # 获取service, 发现CLUSTER-IP未分配
    19. [root@k8s-master mainfest]# kubectl get svc service-headliness -n dev -o wide
    20. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
    21. service-headliness ClusterIP None <none> 80/TCP 9s app=nginx-pod
    22. # 查看service详情
    23. [root@k8s-master mainfest]# kubectl describe svc service-headliness -n dev
    24. Name: service-headliness
    25. Namespace: dev
    26. Labels: <none>
    27. Annotations: <none>
    28. Selector: app=nginx-pod
    29. Type: ClusterIP
    30. IP Families: <none>
    31. IP: None
    32. IPs: None
    33. Port: <unset> 80/TCP
    34. TargetPort: 80/TCP
    35. Endpoints: <none>
    36. Session Affinity: None
    37. Events: <none>

    LoadBalancer类型示例

    在使用支持外部负载均衡器的云提供商的服务时,设置 type 的值为 "LoadBalancer", 将为 Service 提供负载均衡器。 负载均衡器是异步创建的,关于被提供的负载均衡器的信息将会通过 Service 的 status.loadBalancer 字段发布出去

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. name: my-service
    5. spec:
    6. selector:
    7. app: MyApp
    8. ports:
    9. - protocol: TCP
    10. port: 80
    11. targetPort: 9376
    12. clusterIP: 10.0.171.239
    13. type: LoadBalancer
    14. status:
    15. loadBalancer:
    16. ingress:
    17. - ip: 192.0.2.127

    来自外部负载均衡器的流量将直接重定向到后端 Pod 上,不过实际它们是如何工作的,这要依赖于云提供商。

    某些云提供商允许设置 loadBalancerIP。 在这些情况下,将根据用户设置的 loadBalancerIP 来创建负载均衡器。 如果没有设置 loadBalancerIP 字段,将会给负载均衡器指派一个临时 IP。 如果设置了 loadBalancerIP,但云提供商并不支持这种特性,那么设置的 loadBalancerIP 值将会被忽略掉。

    Ingress介绍

    在前面课程中已经提到,Service对集群之外暴露服务的主要方式有两种:NotePort和LoadBalancer,但是这两种方式,都有一定的缺点:

    NodePort方式的缺点是会占用很多集群机器的端口,那么当集群服务变多的时候,这个缺点就愈发明显
    LB方式的缺点是每个service需要一个LB,浪费、麻烦,并且需要kubernetes之外设备的支持
    基于这种现状,kubernetes提供了Ingress资源对象,Ingress只需要一个NodePort或者一个LB就可以满足暴露多个Service的需求。工作机制大致如下图表示

    实际上,Ingress相当于一个7层的负载均衡器,是kubernetes对反向代理的一个抽象,它的工作原理类似于Nginx,可以理解成在Ingress里建立诸多映射规则,Ingress Controller通过监听这些配置规则并转化成Nginx的反向代理配置 , 然后对外部提供服务。在这里有两个核心概念:

    • ingress:kubernetes中的一个对象,作用是定义请求如何转发到service的规则

    • ingress controller:具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发,实现方式有很多,比如Nginx, Contour, Haproxy等等
      Ingress(以Nginx为例)的工作原理如下:

    • 用户编写Ingress规则,说明哪个域名对应kubernetes集群中的哪个Service

    • Ingress控制器动态感知Ingress服务规则的变化,然后生成一段对应的Nginx反向代理配置

    • Ingress控制器会将生成的Nginx配置写入到一个运行着的Nginx服务中,并动态更新

    • 到此为止,其实真正在工作的就是一个Nginx了,内部配置了用户定义的请求转发规则

    Ingress使用

    环境准备
    搭建ingress环境

    1. # 创建文件夹
    2. [root@k8s-master ~]# mkdir ingress-controller
    3. [root@k8s-master ~]# cd ingress-controller
    4. # 获取ingress-nginx,本次案例使用的是1.31版本
    5. # 修改deploy.yaml文件中的仓库
    6. # 修改quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
    7. # 为dyrnq/ingress-nginx-controller:v1.3.1
    8. [root@k8s-master ingress-controller]# grep image deploy.yaml
    9. image: dyrnq/ingress-nginx-controller:v1.3.1
    10. imagePullPolicy: IfNotPresent
    11. image: dyrnq/kube-webhook-certgen:v1.3.0
    12. imagePullPolicy: IfNotPresent
    13. image: dyrnq/kube-webhook-certgen:v1.3.0
    14. imagePullPolicy: IfNotPresent
    15. [root@k8s-master ingress-controller]#
    16. # 创建ingress-nginx
    17. [root@k8s-master ingress-controller]# kubectl apply -f deploy.yaml
    18. # 查看ingress-nginx
    19. [root@k8s-master ~]# kubectl get pods -n ingress-nginx
    20. NAME READY STATUS RESTARTS AGE
    21. ingress-nginx-admission-create-zrp92 0/1 Completed 0 49s
    22. ingress-nginx-admission-patch-s2fj5 0/1 Completed 0 49s
    23. ingress-nginx-controller-5dbc974cb-frg8k 1/1 Running 0 49s
    24. # 查看service
    25. [root@k8s-master ingress-controller]# kubectl get svc -n ingress-nginxNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    26. ingress-nginx-controller NodePort 10.98.74.130 <none> 80:31313/TCP,443:32641/TCP 53s
    27. ingress-nginx-controller-admission ClusterIP 10.99.61.209 <none> 443/TCP 53s

    编写yaml文件

    1. [root@k8s-master ~]# cat ingress-controller/deploy.yaml
    2. apiVersion: v1
    3. kind: Namespace
    4. metadata:
    5. labels:
    6. app.kubernetes.io/instance: ingress-nginx
    7. app.kubernetes.io/name: ingress-nginx
    8. name: ingress-nginx
    9. ---
    10. apiVersion: v1
    11. automountServiceAccountToken: true
    12. kind: ServiceAccount
    13. metadata:
    14. labels:
    15. app.kubernetes.io/component: controller
    16. app.kubernetes.io/instance: ingress-nginx
    17. app.kubernetes.io/name: ingress-nginx
    18. app.kubernetes.io/part-of: ingress-nginx
    19. app.kubernetes.io/version: 1.3.1
    20. name: ingress-nginx
    21. namespace: ingress-nginx
    22. ---
    23. apiVersion: v1
    24. kind: ServiceAccount
    25. metadata:
    26. labels:
    27. app.kubernetes.io/component: admission-webhook
    28. app.kubernetes.io/instance: ingress-nginx
    29. app.kubernetes.io/name: ingress-nginx
    30. app.kubernetes.io/part-of: ingress-nginx
    31. app.kubernetes.io/version: 1.3.1
    32. name: ingress-nginx-admission
    33. namespace: ingress-nginx
    34. ---
    35. apiVersion: rbac.authorization.k8s.io/v1
    36. kind: Role
    37. metadata:
    38. labels:
    39. app.kubernetes.io/component: controller
    40. app.kubernetes.io/instance: ingress-nginx
    41. app.kubernetes.io/name: ingress-nginx
    42. app.kubernetes.io/part-of: ingress-nginx
    43. app.kubernetes.io/version: 1.3.1
    44. name: ingress-nginx
    45. namespace: ingress-nginx
    46. rules:
    47. - apiGroups:
    48. - ""
    49. resources:
    50. - namespaces
    51. verbs:
    52. - get
    53. - apiGroups:
    54. - ""
    55. resources:
    56. - configmaps
    57. - pods
    58. - secrets
    59. - endpoints
    60. verbs:
    61. - get
    62. - list
    63. - watch
    64. - apiGroups:
    65. - ""
    66. resources:
    67. - services
    68. verbs:
    69. - get
    70. - list
    71. - watch
    72. - apiGroups:
    73. - networking.k8s.io
    74. resources:
    75. - ingresses
    76. verbs:
    77. - get
    78. - list
    79. - watch
    80. - apiGroups:
    81. - networking.k8s.io
    82. resources:
    83. - ingresses/status
    84. verbs:
    85. - update
    86. - apiGroups:
    87. - networking.k8s.io
    88. resources:
    89. - ingressclasses
    90. verbs:
    91. - get
    92. - list
    93. - watch
    94. - apiGroups:
    95. - ""
    96. resourceNames:
    97. - ingress-controller-leader
    98. resources:
    99. - configmaps
    100. verbs:
    101. - get
    102. - update
    103. - apiGroups:
    104. - ""
    105. resources:
    106. - configmaps
    107. verbs:
    108. - create
    109. - apiGroups:
    110. - coordination.k8s.io
    111. resourceNames:
    112. - ingress-controller-leader
    113. resources:
    114. - leases
    115. verbs:
    116. - get
    117. - update
    118. - apiGroups:
    119. - coordination.k8s.io
    120. resources:
    121. - leases
    122. verbs:
    123. - create
    124. - apiGroups:
    125. - ""
    126. resources:
    127. - events
    128. verbs:
    129. - create
    130. - patch
    131. ---
    132. apiVersion: rbac.authorization.k8s.io/v1
    133. kind: Role
    134. metadata:
    135. labels:
    136. app.kubernetes.io/component: admission-webhook
    137. app.kubernetes.io/instance: ingress-nginx
    138. app.kubernetes.io/name: ingress-nginx
    139. app.kubernetes.io/part-of: ingress-nginx
    140. app.kubernetes.io/version: 1.3.1
    141. name: ingress-nginx-admission
    142. namespace: ingress-nginx
    143. rules:
    144. - apiGroups:
    145. - ""
    146. resources:
    147. - secrets
    148. verbs:
    149. - get
    150. - create
    151. ---
    152. apiVersion: rbac.authorization.k8s.io/v1
    153. kind: ClusterRole
    154. metadata:
    155. labels:
    156. app.kubernetes.io/instance: ingress-nginx
    157. app.kubernetes.io/name: ingress-nginx
    158. app.kubernetes.io/part-of: ingress-nginx
    159. app.kubernetes.io/version: 1.3.1
    160. name: ingress-nginx
    161. rules:
    162. - apiGroups:
    163. - ""
    164. resources:
    165. - configmaps
    166. - endpoints
    167. - nodes
    168. - pods
    169. - secrets
    170. - namespaces
    171. verbs:
    172. - list
    173. - watch
    174. - apiGroups:
    175. - coordination.k8s.io
    176. resources:
    177. - leases
    178. verbs:
    179. - list
    180. - watch
    181. - apiGroups:
    182. - ""
    183. resources:
    184. - nodes
    185. verbs:
    186. - get
    187. - apiGroups:
    188. - ""
    189. resources:
    190. - services
    191. verbs:
    192. - get
    193. - list
    194. - watch
    195. - apiGroups:
    196. - networking.k8s.io
    197. resources:
    198. - ingresses
    199. verbs:
    200. - get
    201. - list
    202. - watch
    203. - apiGroups:
    204. - ""
    205. resources:
    206. - events
    207. verbs:
    208. - create
    209. - patch
    210. - apiGroups:
    211. - networking.k8s.io
    212. resources:
    213. - ingresses/status
    214. verbs:
    215. - update
    216. - apiGroups:
    217. - networking.k8s.io
    218. resources:
    219. - ingressclasses
    220. verbs:
    221. - get
    222. - list
    223. - watch
    224. ---
    225. apiVersion: rbac.authorization.k8s.io/v1
    226. kind: ClusterRole
    227. metadata:
    228. labels:
    229. app.kubernetes.io/component: admission-webhook
    230. app.kubernetes.io/instance: ingress-nginx
    231. app.kubernetes.io/name: ingress-nginx
    232. app.kubernetes.io/part-of: ingress-nginx
    233. app.kubernetes.io/version: 1.3.1
    234. name: ingress-nginx-admission
    235. rules:
    236. - apiGroups:
    237. - admissionregistration.k8s.io
    238. resources:
    239. - validatingwebhookconfigurations
    240. verbs:
    241. - get
    242. - update
    243. ---
    244. apiVersion: rbac.authorization.k8s.io/v1
    245. kind: RoleBinding
    246. metadata:
    247. labels:
    248. app.kubernetes.io/component: controller
    249. app.kubernetes.io/instance: ingress-nginx
    250. app.kubernetes.io/name: ingress-nginx
    251. app.kubernetes.io/part-of: ingress-nginx
    252. app.kubernetes.io/version: 1.3.1
    253. name: ingress-nginx
    254. namespace: ingress-nginx
    255. roleRef:
    256. apiGroup: rbac.authorization.k8s.io
    257. kind: Role
    258. name: ingress-nginx
    259. subjects:
    260. - kind: ServiceAccount
    261. name: ingress-nginx
    262. namespace: ingress-nginx
    263. ---
    264. apiVersion: rbac.authorization.k8s.io/v1
    265. kind: RoleBinding
    266. metadata:
    267. labels:
    268. app.kubernetes.io/component: admission-webhook
    269. app.kubernetes.io/instance: ingress-nginx
    270. app.kubernetes.io/name: ingress-nginx
    271. app.kubernetes.io/part-of: ingress-nginx
    272. app.kubernetes.io/version: 1.3.1
    273. name: ingress-nginx-admission
    274. namespace: ingress-nginx
    275. roleRef:
    276. apiGroup: rbac.authorization.k8s.io
    277. kind: Role
    278. name: ingress-nginx-admission
    279. subjects:
    280. - kind: ServiceAccount
    281. name: ingress-nginx-admission
    282. namespace: ingress-nginx
    283. ---
    284. apiVersion: rbac.authorization.k8s.io/v1
    285. kind: ClusterRoleBinding
    286. metadata:
    287. labels:
    288. app.kubernetes.io/instance: ingress-nginx
    289. app.kubernetes.io/name: ingress-nginx
    290. app.kubernetes.io/part-of: ingress-nginx
    291. app.kubernetes.io/version: 1.3.1
    292. name: ingress-nginx
    293. roleRef:
    294. apiGroup: rbac.authorization.k8s.io
    295. kind: ClusterRole
    296. name: ingress-nginx
    297. subjects:
    298. - kind: ServiceAccount
    299. name: ingress-nginx
    300. namespace: ingress-nginx
    301. ---
    302. apiVersion: rbac.authorization.k8s.io/v1
    303. kind: ClusterRoleBinding
    304. metadata:
    305. labels:
    306. app.kubernetes.io/component: admission-webhook
    307. app.kubernetes.io/instance: ingress-nginx
    308. app.kubernetes.io/name: ingress-nginx
    309. app.kubernetes.io/part-of: ingress-nginx
    310. app.kubernetes.io/version: 1.3.1
    311. name: ingress-nginx-admission
    312. roleRef:
    313. apiGroup: rbac.authorization.k8s.io
    314. kind: ClusterRole
    315. name: ingress-nginx-admission
    316. subjects:
    317. - kind: ServiceAccount
    318. name: ingress-nginx-admission
    319. namespace: ingress-nginx
    320. ---
    321. apiVersion: v1
    322. data:
    323. allow-snippet-annotations: "true"
    324. kind: ConfigMap
    325. metadata:
    326. labels:
    327. app.kubernetes.io/component: controller
    328. app.kubernetes.io/instance: ingress-nginx
    329. app.kubernetes.io/name: ingress-nginx
    330. app.kubernetes.io/part-of: ingress-nginx
    331. app.kubernetes.io/version: 1.3.1
    332. name: ingress-nginx-controller
    333. namespace: ingress-nginx
    334. ---
    335. apiVersion: v1
    336. kind: Service
    337. metadata:
    338. labels:
    339. app.kubernetes.io/component: controller
    340. app.kubernetes.io/instance: ingress-nginx
    341. app.kubernetes.io/name: ingress-nginx
    342. app.kubernetes.io/part-of: ingress-nginx
    343. app.kubernetes.io/version: 1.3.1
    344. name: ingress-nginx-controller
    345. namespace: ingress-nginx
    346. spec:
    347. externalTrafficPolicy: Local
    348. ipFamilies:
    349. - IPv4
    350. ipFamilyPolicy: SingleStack
    351. ports:
    352. - appProtocol: http
    353. name: http
    354. port: 80
    355. protocol: TCP
    356. targetPort: http
    357. - appProtocol: https
    358. name: https
    359. port: 443
    360. protocol: TCP
    361. targetPort: https
    362. selector:
    363. app.kubernetes.io/component: controller
    364. app.kubernetes.io/instance: ingress-nginx
    365. app.kubernetes.io/name: ingress-nginx
    366. type: NodePort
    367. ---
    368. apiVersion: v1
    369. kind: Service
    370. metadata:
    371. labels:
    372. app.kubernetes.io/component: controller
    373. app.kubernetes.io/instance: ingress-nginx
    374. app.kubernetes.io/name: ingress-nginx
    375. app.kubernetes.io/part-of: ingress-nginx
    376. app.kubernetes.io/version: 1.3.1
    377. name: ingress-nginx-controller-admission
    378. namespace: ingress-nginx
    379. spec:
    380. ports:
    381. - appProtocol: https
    382. name: https-webhook
    383. port: 443
    384. targetPort: webhook
    385. selector:
    386. app.kubernetes.io/component: controller
    387. app.kubernetes.io/instance: ingress-nginx
    388. app.kubernetes.io/name: ingress-nginx
    389. type: ClusterIP
    390. ---
    391. apiVersion: apps/v1
    392. kind: Deployment
    393. metadata:
    394. labels:
    395. app.kubernetes.io/component: controller
    396. app.kubernetes.io/instance: ingress-nginx
    397. app.kubernetes.io/name: ingress-nginx
    398. app.kubernetes.io/part-of: ingress-nginx
    399. app.kubernetes.io/version: 1.3.1
    400. name: ingress-nginx-controller
    401. namespace: ingress-nginx
    402. spec:
    403. minReadySeconds: 0
    404. revisionHistoryLimit: 10
    405. selector:
    406. matchLabels:
    407. app.kubernetes.io/component: controller
    408. app.kubernetes.io/instance: ingress-nginx
    409. app.kubernetes.io/name: ingress-nginx
    410. template:
    411. metadata:
    412. labels:
    413. app.kubernetes.io/component: controller
    414. app.kubernetes.io/instance: ingress-nginx
    415. app.kubernetes.io/name: ingress-nginx
    416. spec:
    417. containers:
    418. - args:
    419. - /nginx-ingress-controller
    420. - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
    421. - --election-id=ingress-controller-leader
    422. - --controller-class=k8s.io/ingress-nginx
    423. - --ingress-class=nginx
    424. - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
    425. - --validating-webhook=:8443
    426. - --validating-webhook-certificate=/usr/local/certificates/cert
    427. - --validating-webhook-key=/usr/local/certificates/key
    428. env:
    429. - name: POD_NAME
    430. valueFrom:
    431. fieldRef:
    432. fieldPath: metadata.name
    433. - name: POD_NAMESPACE
    434. valueFrom:
    435. fieldRef:
    436. fieldPath: metadata.namespace
    437. - name: LD_PRELOAD
    438. value: /usr/local/lib/libmimalloc.so
    439. image: dyrnq/ingress-nginx-controller:v1.3.1
    440. imagePullPolicy: IfNotPresent
    441. lifecycle:
    442. preStop:
    443. exec:
    444. command:
    445. - /wait-shutdown
    446. livenessProbe:
    447. failureThreshold: 5
    448. httpGet:
    449. path: /healthz
    450. port: 10254
    451. scheme: HTTP
    452. initialDelaySeconds: 10
    453. periodSeconds: 10
    454. successThreshold: 1
    455. timeoutSeconds: 1
    456. name: controller
    457. ports:
    458. - containerPort: 80
    459. name: http
    460. protocol: TCP
    461. - containerPort: 443
    462. name: https
    463. protocol: TCP
    464. - containerPort: 8443
    465. name: webhook
    466. protocol: TCP
    467. readinessProbe:
    468. failureThreshold: 3
    469. httpGet:
    470. path: /healthz
    471. port: 10254
    472. scheme: HTTP
    473. initialDelaySeconds: 10
    474. periodSeconds: 10
    475. successThreshold: 1
    476. timeoutSeconds: 1
    477. resources:
    478. requests:
    479. cpu: 100m
    480. memory: 90Mi
    481. securityContext:
    482. allowPrivilegeEscalation: true
    483. capabilities:
    484. add:
    485. - NET_BIND_SERVICE
    486. drop:
    487. - ALL
    488. runAsUser: 101
    489. volumeMounts:
    490. - mountPath: /usr/local/certificates/
    491. name: webhook-cert
    492. readOnly: true
    493. dnsPolicy: ClusterFirst
    494. nodeSelector:
    495. kubernetes.io/os: linux
    496. serviceAccountName: ingress-nginx
    497. terminationGracePeriodSeconds: 300
    498. volumes:
    499. - name: webhook-cert
    500. secret:
    501. secretName: ingress-nginx-admission
    502. ---
    503. apiVersion: batch/v1
    504. kind: Job
    505. metadata:
    506. labels:
    507. app.kubernetes.io/component: admission-webhook
    508. app.kubernetes.io/instance: ingress-nginx
    509. app.kubernetes.io/name: ingress-nginx
    510. app.kubernetes.io/part-of: ingress-nginx
    511. app.kubernetes.io/version: 1.3.1
    512. name: ingress-nginx-admission-create
    513. namespace: ingress-nginx
    514. spec:
    515. template:
    516. metadata:
    517. labels:
    518. app.kubernetes.io/component: admission-webhook
    519. app.kubernetes.io/instance: ingress-nginx
    520. app.kubernetes.io/name: ingress-nginx
    521. app.kubernetes.io/part-of: ingress-nginx
    522. app.kubernetes.io/version: 1.3.1
    523. name: ingress-nginx-admission-create
    524. spec:
    525. containers:
    526. - args:
    527. - create
    528. - --host=ingress-nginx-controller-admission,ingress-nginx-controller-admission.$(POD_NAMESPACE).svc
    529. - --namespace=$(POD_NAMESPACE)
    530. - --secret-name=ingress-nginx-admission
    531. env:
    532. - name: POD_NAMESPACE
    533. valueFrom:
    534. fieldRef:
    535. fieldPath: metadata.namespace
    536. image: dyrnq/kube-webhook-certgen:v1.3.0
    537. imagePullPolicy: IfNotPresent
    538. name: create
    539. securityContext:
    540. allowPrivilegeEscalation: false
    541. nodeSelector:
    542. kubernetes.io/os: linux
    543. restartPolicy: OnFailure
    544. securityContext:
    545. fsGroup: 2000
    546. runAsNonRoot: true
    547. runAsUser: 2000
    548. serviceAccountName: ingress-nginx-admission
    549. ---
    550. apiVersion: batch/v1
    551. kind: Job
    552. metadata:
    553. labels:
    554. app.kubernetes.io/component: admission-webhook
    555. app.kubernetes.io/instance: ingress-nginx
    556. app.kubernetes.io/name: ingress-nginx
    557. app.kubernetes.io/part-of: ingress-nginx
    558. app.kubernetes.io/version: 1.3.1
    559. name: ingress-nginx-admission-patch
    560. namespace: ingress-nginx
    561. spec:
    562. template:
    563. metadata:
    564. labels:
    565. app.kubernetes.io/component: admission-webhook
    566. app.kubernetes.io/instance: ingress-nginx
    567. app.kubernetes.io/name: ingress-nginx
    568. app.kubernetes.io/part-of: ingress-nginx
    569. app.kubernetes.io/version: 1.3.1
    570. name: ingress-nginx-admission-patch
    571. spec:
    572. containers:
    573. - args:
    574. - patch
    575. - --webhook-name=ingress-nginx-admission
    576. - --namespace=$(POD_NAMESPACE)
    577. - --patch-mutating=false
    578. - --secret-name=ingress-nginx-admission
    579. - --patch-failure-policy=Fail
    580. env:
    581. - name: POD_NAMESPACE
    582. valueFrom:
    583. fieldRef:
    584. fieldPath: metadata.namespace
    585. image: dyrnq/kube-webhook-certgen:v1.3.0
    586. imagePullPolicy: IfNotPresent
    587. name: patch
    588. securityContext:
    589. allowPrivilegeEscalation: false
    590. nodeSelector:
    591. kubernetes.io/os: linux
    592. restartPolicy: OnFailure
    593. securityContext:
    594. fsGroup: 2000
    595. runAsNonRoot: true
    596. runAsUser: 2000
    597. serviceAccountName: ingress-nginx-admission
    598. ---
    599. apiVersion: networking.k8s.io/v1
    600. kind: IngressClass
    601. metadata:
    602. labels:
    603. app.kubernetes.io/component: controller
    604. app.kubernetes.io/instance: ingress-nginx
    605. app.kubernetes.io/name: ingress-nginx
    606. app.kubernetes.io/part-of: ingress-nginx
    607. app.kubernetes.io/version: 1.3.1
    608. name: nginx
    609. spec:
    610. controller: k8s.io/ingress-nginx
    611. ---
    612. apiVersion: admissionregistration.k8s.io/v1
    613. kind: ValidatingWebhookConfiguration
    614. metadata:
    615. labels:
    616. app.kubernetes.io/component: admission-webhook
    617. app.kubernetes.io/instance: ingress-nginx
    618. app.kubernetes.io/name: ingress-nginx
    619. app.kubernetes.io/part-of: ingress-nginx
    620. app.kubernetes.io/version: 1.3.1
    621. name: ingress-nginx-admission
    622. webhooks:
    623. - admissionReviewVersions:
    624. - v1
    625. clientConfig:
    626. service:
    627. name: ingress-nginx-controller-admission
    628. namespace: ingress-nginx
    629. path: /networking/v1/ingresses
    630. failurePolicy: Fail
    631. matchPolicy: Equivalent
    632. name: validate.nginx.ingress.kubernetes.io
    633. rules:
    634. - apiGroups:
    635. - networking.k8s.io
    636. apiVersions:
    637. - v1
    638. operations:
    639. - CREATE
    640. - UPDATE
    641. resources:
    642. - ingresses
    643. sideEffects: None

    准备service与pod

    1. [root@k8s-master ingress-controller]# cat tomcat-nginx.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: nginx-deployment
    6. namespace: dev
    7. spec:
    8. replicas: 3
    9. selector:
    10. matchLabels:
    11. app: nginx-pod
    12. template:
    13. metadata:
    14. labels:
    15. app: nginx-pod
    16. spec:
    17. containers:
    18. - name: nginx
    19. image: nginx:1.17.1
    20. ports:
    21. - containerPort: 80
    22. ---
    23. apiVersion: apps/v1
    24. kind: Deployment
    25. metadata:
    26. name: tomcat-deployment
    27. namespace: dev
    28. spec:
    29. replicas: 3
    30. selector:
    31. matchLabels:
    32. app: tomcat-pod
    33. template:
    34. metadata:
    35. labels:
    36. app: tomcat-pod
    37. spec:
    38. containers:
    39. - name: tomcat
    40. image: tomcat:8.5-jre10-slim
    41. ports:
    42. - containerPort: 8080
    43. ---
    44. apiVersion: v1
    45. kind: Service
    46. metadata:
    47. name: nginx-service
    48. namespace: dev
    49. spec:
    50. selector:
    51. app: nginx-pod
    52. type: ClusterIP
    53. ports:
    54. - port: 80
    55. targetPort: 80
    56. ---
    57. apiVersion: v1
    58. kind: Service
    59. metadata:
    60. name: tomcat-service
    61. namespace: dev
    62. spec:
    63. selector:
    64. app: tomcat-pod
    65. type: ClusterIP
    66. ports:
    67. - port: 8080
    68. targetPort: 8080

    创建pod并且运行

    1. # 创建
    2. [root@k8s-master ingress-controller]# kubectl apply -f tomcat-nginx.yaml
    3. deployment.apps/nginx-deployment created
    4. deployment.apps/tomcat-deployment created
    5. service/nginx-service created
    6. service/tomcat-service created
    7. [root@k8s-master ingress-controller]#
    8. # 查看
    9. [root@k8s-master ingress-controller]# kubectl get svc -n devNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    10. nginx-service ClusterIP 10.100.5.73 <none> 80/TCP 74s
    11. tomcat-service ClusterIP 10.100.153.3 <none> 8080/TCP 74s
    12. [root@k8s-master ingress-controller]# kubectl get -f tomcat-nginx.yaml
    13. NAME READY UP-TO-DATE AVAILABLE AGE
    14. deployment.apps/nginx-deployment 3/3 3 3 83s
    15. deployment.apps/tomcat-deployment 3/3 3 3 83s
    16. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    17. service/nginx-service ClusterIP 10.100.5.73 <none> 80/TCP 83s
    18. service/tomcat-service ClusterIP 10.100.153.3 <none> 8080/TCP 83s

  • 相关阅读:
    【每日一题Day328】LC198打家劫舍 | 动态规划
    Flutter 实现背景图片毛玻璃效果
    h3c OSPF和ISIS双点双向引入配置
    推荐两款Windows效率提升工具
    嘉立创使用技巧
    2022北京大健康产业博览会/营养健康/特医食品/药食同源展
    七层和四层的区别
    docker 安装 mysql (单体架构)
    2019中原银行java实习面试
    【Shell脚本】Shell编程之数组
  • 原文地址:https://blog.csdn.net/qq_58328312/article/details/126883246