ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【云原生 | 从零开始学Kubernetes】十九、Kubernetes核心技能Service实战 [打印本页]

作者: 鼠扑    时间: 2024-6-13 11:13
标题: 【云原生 | 从零开始学Kubernetes】十九、Kubernetes核心技能Service实战
该篇文章已经被专栏《从零开始学k8s》收录
上一篇文章:Kubernetes核心技能Service实战
  

继承我们上一章没讲完的内容!

  
创建Service:type类型是NodePort

  1. 1、创建一个 pod 资源
  2. [root@k8smaster service]# vim pod_nodeport.yaml
  3. apiVersion: apps/v1
  4. kind: Deployment
  5. metadata:
  6.   name: my-nginx-nodeport
  7. spec:
  8.   selector:
  9.     matchLabels:
  10.       run: my-nginx-nodeport
  11.   replicas: 2  
  12.   template:
  13.     metadata:
  14.       labels:
  15.         run: my-nginx-nodeport
  16.     spec:
  17.       containers:
  18.       - name: my-nginx-nodeport-container
  19.         image: nginx
  20.         imagePullPolicy: IfNotPresent
  21.         ports:
  22.         - containerPort: 80
  23. #更新资源清单文件
  24. [root@k8smaster service]# kubectl apply -f pod_nodeport.yaml
  25. deployment.apps/my-nginx-nodeport created
  26. #查看 pod 是否创建成功
  27. [root@k8smaster service]# kubectl get pods -l run=my-nginx-nodeport
  28. NAME                                 READY   STATUS    RESTARTS   AGE
  29. my-nginx-nodeport-5fccbb754b-jdj67   1/1     Running   0          19s
  30. my-nginx-nodeport-5fccbb754b-w5f8l   1/1     Running   0          19s
  31. 2、创建 service,代理 pod
  32. [root@xianchaomaster1 ~]# vim service_nodeport.yaml
  33. apiVersion: v1
  34. kind: Service
  35. metadata:
  36.   name: my-nginx-nodeport
  37.   labels:  
  38.     run: my-nginx-nodeport  
  39. spec:
  40.   type: NodePort
  41.   ports:
  42.   - port: 80
  43.     protocol: TCP
  44.     targetPort: 80
  45.     nodePort: 30380
  46.   selector:
  47.     run: my-nginx-nodeport
  48.    
  49. #更新资源清单文件
  50. [root@k8smaster service]# kubectl apply -f service_nodeport.yaml
  51. service/my-nginx-nodeport created
  52. #查看刚才创建的 service
  53. [root@k8smaster service]# kubectl get svc -l run=my-nginx-nodeport
  54. NAME                TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
  55. my-nginx-nodeport   NodePort   10.97.89.147   <none>        80:30380/TCP   111s
  56. [root@k8smaster service]# kubectl get pods -o wide
  57. NAME                                 READY   STATUS    RESTARTS   AGE     IP            NODE       NOMINATED
  58. my-nginx-nodeport-5fccbb754b-jdj67   1/1     Running   0          9m14s   10.244.1.37   k8snode2   <none>   
  59. my-nginx-nodeport-5fccbb754b-w5f8l   1/1     Running   0          9m14s   10.244.2.38   k8snode    <none>   
  60. [root@k8smaster service]# kubectl describe svc my-nginx-nodeport
  61. Name:                     my-nginx-nodeport
  62. Namespace:                default
  63. Labels:                   run=my-nginx-nodeport
  64. Annotations:              Selector:  run=my-nginx-nodeport
  65. Type:                     NodePort
  66. IP:                       10.97.89.147
  67. Port:                     <unset>  80/TCP
  68. TargetPort:               80/TCP
  69. NodePort:                 <unset>  30380/TCP
  70. Endpoints:                10.244.1.37:80,10.244.2.38:80
  71. Session Affinity:         None
  72. External Traffic Policy:  Cluster
  73. Events:                   <none>
  74. #ip一样的
  75. #访问 service
  76. [root@k8smaster service]# curl 10.97.89.147
  77. <!DOCTYPE html>
  78. <html>
  79. <head>
  80. <title>Welcome to nginx!</title>
  81. 注意:
  82. 10.100.156.7 是 k8s 集群内部的 service ip 地址,只能在 k8s 集群内部访问,在集群外无法访问。
  83. 都是80端口也没事,不冲突,会有新的ip加入到防火墙规则。
  84. #在集群外访问 service
  85. [root@k8smaster service]# curl 192.168.11.139:30380
  86. <!DOCTYPE html>
  87. <html>
  88. <head>
  89. <title>Welcome to nginx!</title>
  90. #在浏览器访问 service
复制代码

服务哀求走向
Client-node ip:30380->service ip:80->pod ip:container port
Client->192.168.11.139:30380->10.97.89.147:80->pod ip:80
创建Service:type类型是ExternalName

  1. 应用场景:跨名称空间访问
  2. 需求:default 名称空间下的 client 服务想要访问 nginx-ns 名称空间下的 nginx-svc 服务
  3. docker load -i busybox.tar.gz
  4. node1,2下载busybox
  5. [root@k8smaster service]# vim client.yaml
  6. apiVersion: apps/v1
  7. kind: Deployment
  8. metadata:
  9.   name: client
  10. spec:
  11.   replicas: 1
  12.   selector:
  13.     matchLabels:
  14.       app: busybox
  15.   template:
  16.     metadata:
  17.       labels:
  18.         app: busybox
  19.     spec:
  20.       containers:
  21.       - name: busybox
  22.         image: busybox
  23.         imagePullPolicy: IfNotPresent
  24.         command: ["/bin/sh","-c","sleep 36000"]
  25. [root@k8smaster service]# kubectl apply -f client.yaml
  26. deployment.apps/client created
  27. [root@k8smaster service]# vim client_svc.yaml
  28. apiVersion: v1
  29. kind: Service
  30. metadata:
  31.   name: client-svc
  32. spec:
  33.   type: ExternalName
  34.   externalName: nginx-svc.nginx-ns.svc.cluster.local
  35.   ports:
  36.   - name: http
  37.     port: 80
  38.     targetPort: 80
  39. 该文件中指定了到 nginx-svc 的软链,让使用者感觉就好像调用自己命名空间的服务一样,访问 client-svc 会代理到 nginx-svc.nginx-ns.svc.cluster.local
  40. [root@k8smaster service]# kubectl apply -f client_svc.yaml
  41. service/client-svc created
  42. 查看 pod 是否正常运行
  43. [root@k8smaster service]# kubectl get pods
  44. NAME                     READY   STATUS    RESTARTS   AGE
  45. client-849cbd69b-76hcp   1/1     Running   0          5m22s
  46. [root@k8smaster service]# kubectl describe svc client-svc
  47. Name:              client-svc
  48. Namespace:         default
  49. Labels:            <none>
  50. Annotations:       Selector:  <none>
  51. Type:              ExternalName
  52. IP:               
  53. External Name:     nginx-svc.nginx-ns.svc.cluster.local                #FQDN
  54. Port:              http  80/TCP                                                                #服务本身端口
  55. TargetPort:        80/TCP
  56. Endpoints:         <none>                                                                        #因为没有定义selector所以也是空
  57. Session Affinity:  None
  58. Events:            <none>
  59. #新建一个命名空间,把nginx的东西放在下面。
  60. [root@k8smaster service]# kubectl create ns nginx-ns
  61. namespace/nginx-ns created
  62. [root@k8smaster service]# vim server_nginx.yaml
  63. apiVersion: apps/v1
  64. kind: Deployment
  65. metadata:
  66.   name: nginx
  67.   namespace: nginx-ns
  68. spec:
  69.   replicas: 1
  70.   selector:
  71.     matchLabels:     
  72.       app: nginx  
  73.   template:
  74.     metadata:
  75.       labels:
  76.         app: nginx
  77.     spec:
  78.       containers:
  79.       - name: nginx
  80.         image: nginx
  81.         imagePullPolicy: IfNotPresent
  82. #nginx默认暴露80,所以可以找到deploy控制器创建的pod,进入到pod封装的容器nginx里面。
  83. [root@k8smaster service]# kubectl apply -f server_nginx.yaml
  84. deployment.apps/nginx created
  85. #查看 pod 是否创建成功
  86. [root@k8smaster service]# kubectl get pods -n nginx-ns
  87. NAME                     READY   STATUS    RESTARTS   AGE
  88. nginx-5957f949fc-9nwbh   1/1     Running   0          10s
  89. [root@xianchaomaster1 exter]# vim nginx_svc.yaml
  90. apiVersion: v1
  91. kind: Service
  92. metadata:
  93.   name: nginx-svc
  94.   namespace: nginx-ns
  95. spec:
  96.   selector:
  97.     app: nginx
  98.   ports:
  99.   - name: http
  100.     protocol: TCP
  101.     port: 80
  102.     targetPort: 80
  103. [root@k8smaster service]# kubectl apply -f nginx_svc.yaml
  104. service/nginx-svc created
  105. [root@k8smaster service]# kubectl describe svc nginx-svc -n nginx-ns
  106. Name:              nginx-svc
  107. Namespace:         nginx-ns
  108. Labels:            <none>
  109. Annotations:       Selector:  app=nginx
  110. Type:              ClusterIP
  111. IP:                10.101.124.84
  112. Port:              http  80/TCP
  113. TargetPort:        80/TCP
  114. Endpoints:         10.244.1.39:80      #ip是一样的 这个service通过标签选择器选择app=nginx的pod也就是第二个模板创建的
  115. Session Affinity:  None
  116. Events:            <none>
  117. [root@k8smaster service]# kubectl get pods -o wide -n nginx-ns
  118. NAME                     READY   STATUS    RESTARTS   AGE     IP            NODE     
  119. nginx-5957f949fc-9nwbh   1/1     Running   0          7m49s   10.244.1.39   k8snode2
  120. [root@k8smaster service]# curl 10.101.124.84
  121. <!DOCTYPE html>
  122. <html>
  123. <head>
  124. <title>Welcome to nginx!</title>
  125. #登录到 client pod
  126. [root@xianchaomaster1 exter]# kubectl exec -it client-849cbd69b-76hcp -- /bin/sh
  127. / # wget -q -O - client-svc.default.svc.cluster.local
  128. wget -q -O - nginx-svc.nginx-ns.svc.cluster.local
  129. #上面两个请求的结果一样,这个实验是为了有些情况下想通过默认命名空间下的全局限定域名到其他命名空间下的服务和服务区域通信访问。
复制代码
映射外部服务案例

k8s 集群引用外部的 mysql 数据库
  1. node2安装mysql
  2. [root@k8snode2 ~]# yum install mariadb-server.x86_64 -y
  3. [root@k8snode2 ~]# systemctl start mariadb
  4. [root@k8snode2 ~]# systemctl enable mariadb
  5. [root@k8smaster ~]# mkdir mysql
  6. [root@k8smaster ~]# cd mysql/
  7. [root@k8smaster mysql]# vim mysql_service.yaml
  8. apiVersion: v1
  9. kind: Service
  10. metadata:
  11.   name: mysql
  12. spec:
  13.   type: ClusterIP
  14.   ports:
  15.   - port: 3306
  16. [root@k8smaster mysql]# kubectl apply -f mysql_service.yaml
  17. service/mysql created
  18. [root@k8smaster mysql]# kubectl get svc | grep mysql
  19. mysql        ClusterIP      10.103.7.164   <none>                                 3306/TCP   4s
  20. [root@k8smaster mysql]# kubectl describe svc mysql
  21. Name:              mysql
  22. Namespace:         default
  23. Labels:            <none>
  24. Annotations:       Selector:  <none>
  25. Type:              ClusterIP
  26. IP:                10.103.7.164
  27. Port:              <unset>  3306/TCP
  28. TargetPort:        3306/TCP
  29. Endpoints:         <none>                #还没有 endpoint
  30. Session Affinity:  None
  31. Events:            <none>
  32. [root@k8smaster mysql]# vim mysql_endpoint.yaml        endpoint和svc的名字保持一致
  33. apiVersion: v1
  34. kind: Endpoints                        
  35. metadata:
  36.   name: mysql
  37. subsets:
  38. - addresses:  
  39.   - ip: 192.168.40.182
  40.   ports:  
  41.   - port: 3306
  42. [root@k8smaster mysql]# kubectl apply -f mysql_endpoint.yaml
  43. endpoints/mysql created
  44. [root@k8smaster mysql]# kubectl describe svc mysql
  45. Name:              mysql
  46. Namespace:         default
  47. Labels:            <none>
  48. Annotations:       Selector:  <none>
  49. Type:              ClusterIP
  50. IP:                10.103.7.164
  51. Port:              <unset>  3306/TCP
  52. TargetPort:        3306/TCP
  53. Endpoints:         192.168.40.182:3306                        #这就是定义的外部数据库
  54. Session Affinity:  None
  55. Events:            <none>
  56. mysql.default.svc.cluster.local            #这就是它的全局域名
复制代码
上面设置就是将外部 IP 地址和服务引入到 k8s 集群内部(其他节点),由 service 作为一个代理来到达可以或许访问外部服务的目的。
写在最后

创作不易,假如觉得内容对你有帮助,贫苦给个三连关注支持一下我!假如有错误,请在批评区指出,我会实时更改!
目前正在更新的系列:从零开始学k8s
感谢各位的观看,文章掺杂个人理解,如有错误请接洽我指出~


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4