[Nativo de la nube | Aprenda Kubernetes desde cero] 19. Servicio de tecnología central de Kubernetes en combate real

Este artículo se ha incluido en la columna " Aprender k8s desde cero "
Artículo anterior: Kubernetes core technology Service combat

inserte la descripción de la imagen aquí

¡Continúa lo que dejamos en el último capítulo!

Crear servicio: el tipo es NodePort

1、创建一个 pod 资源 
[root@k8smaster service]# vim pod_nodeport.yaml 
apiVersion: apps/v1
kind: Deployment 
metadata: 
  name: my-nginx-nodeport
spec: 
  selector:
    matchLabels:
      run: my-nginx-nodeport
  replicas: 2  
  template:
    metadata:
      labels:
        run: my-nginx-nodeport
    spec:
      containers:
      - name: my-nginx-nodeport-container
        image: nginx 
        imagePullPolicy: IfNotPresent
        ports: 
        - containerPort: 80
#更新资源清单文件 
[root@k8smaster service]# kubectl apply -f pod_nodeport.yaml 
deployment.apps/my-nginx-nodeport created
#查看 pod 是否创建成功 
[root@k8smaster service]# kubectl get pods -l run=my-nginx-nodeport 
NAME                                 READY   STATUS    RESTARTS   AGE
my-nginx-nodeport-5fccbb754b-jdj67   1/1     Running   0          19s
my-nginx-nodeport-5fccbb754b-w5f8l   1/1     Running   0          19s
 
2、创建 service,代理 pod 
[root@xianchaomaster1 ~]# vim service_nodeport.yaml 
apiVersion: v1
kind: Service 
metadata: 
  name: my-nginx-nodeport
  labels:  
    run: my-nginx-nodeport  
spec: 
  type: NodePort
  ports:
  - port: 80 
    protocol: TCP
    targetPort: 80
    nodePort: 30380
  selector:
    run: my-nginx-nodeport
    
#更新资源清单文件 
[root@k8smaster service]# kubectl apply -f service_nodeport.yaml 
service/my-nginx-nodeport created

#查看刚才创建的 service 
[root@k8smaster service]# kubectl get svc -l run=my-nginx-nodeport 
NAME                TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
my-nginx-nodeport   NodePort   10.97.89.147   <none>        80:30380/TCP   111s

[root@k8smaster service]# kubectl get pods -o wide
NAME                                 READY   STATUS    RESTARTS   AGE     IP            NODE       NOMINATED
my-nginx-nodeport-5fccbb754b-jdj67   1/1     Running   0          9m14s   10.244.1.37   k8snode2   <none>   
my-nginx-nodeport-5fccbb754b-w5f8l   1/1     Running   0          9m14s   10.244.2.38   k8snode    <none>   
[root@k8smaster service]# kubectl describe svc my-nginx-nodeport
Name:                     my-nginx-nodeport
Namespace:                default
Labels:                   run=my-nginx-nodeport
Annotations:              Selector:  run=my-nginx-nodeport
Type:                     NodePort
IP:                       10.97.89.147
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30380/TCP
Endpoints:                10.244.1.37:80,10.244.2.38:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
#ip一样的

#访问 service 
[root@k8smaster service]# curl 10.97.89.147
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
注意: 
10.100.156.7 是 k8s 集群内部的 service ip 地址,只能在 k8s 集群内部访问,在集群外无法访问。 
都是80端口也没事,不冲突,会有新的ip加入到防火墙规则。

#在集群外访问 service 
[root@k8smaster service]# curl 192.168.11.139:30380
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

#在浏览器访问 service

inserte la descripción de la imagen aquí
La solicitud de servicio va a
IP de nodo de cliente: 30380-> IP de servicio: 80-> IP de pod: puerto de contenedor
Cliente-> 192.168.11.139: 30380-> 10.97.89.147: 80-> IP de pod: 80

Crear servicio: el tipo de tipo es ExternalName

应用场景:跨名称空间访问 
需求:default 名称空间下的 client 服务想要访问 nginx-ns 名称空间下的 nginx-svc 服务 

docker load -i busybox.tar.gz
node1,2下载busybox
[root@k8smaster service]# vim client.yaml
apiVersion: apps/v1
kind: Deployment 
metadata: 
  name: client
spec: 
  replicas: 1
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["/bin/sh","-c","sleep 36000"]
[root@k8smaster service]# kubectl apply -f client.yaml 
deployment.apps/client created
[root@k8smaster service]# vim client_svc.yaml 
apiVersion: v1
kind: Service
metadata: 
  name: client-svc
spec: 
  type: ExternalName
  externalName: nginx-svc.nginx-ns.svc.cluster.local
  ports:
  - name: http
    port: 80
    targetPort: 80
该文件中指定了到 nginx-svc 的软链,让使用者感觉就好像调用自己命名空间的服务一样,访问 client-svc 会代理到 nginx-svc.nginx-ns.svc.cluster.local

[root@k8smaster service]# kubectl apply -f client_svc.yaml 
service/client-svc created

查看 pod 是否正常运行
[root@k8smaster service]# kubectl get pods 
NAME                     READY   STATUS    RESTARTS   AGE
client-849cbd69b-76hcp   1/1     Running   0          5m22s
[root@k8smaster service]# kubectl describe svc client-svc
Name:              client-svc
Namespace:         default
Labels:            <none>
Annotations:       Selector:  <none>
Type:              ExternalName
IP:                
External Name:     nginx-svc.nginx-ns.svc.cluster.local		#FQDN
Port:              http  80/TCP								#服务本身端口
TargetPort:        80/TCP
Endpoints:         <none>									#因为没有定义selector所以也是空
Session Affinity:  None
Events:            <none>
#新建一个命名空间,把nginx的东西放在下面。
[root@k8smaster service]# kubectl create ns nginx-ns 
namespace/nginx-ns created
[root@k8smaster service]# vim server_nginx.yaml 
apiVersion: apps/v1
kind: Deployment 
metadata: 
  name: nginx
  namespace: nginx-ns
spec: 
  replicas: 1
  selector:
    matchLabels:     
      app: nginx  
  template: 
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
#nginx默认暴露80,所以可以找到deploy控制器创建的pod,进入到pod封装的容器nginx里面。
[root@k8smaster service]# kubectl apply -f server_nginx.yaml 
deployment.apps/nginx created
#查看 pod 是否创建成功 
[root@k8smaster service]# kubectl get pods -n nginx-ns 
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5957f949fc-9nwbh   1/1     Running   0          10s

[root@xianchaomaster1 exter]# vim nginx_svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: nginx-ns
spec:
  selector:
    app: nginx
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
[root@k8smaster service]# kubectl apply -f nginx_svc.yaml 
service/nginx-svc created
[root@k8smaster service]# kubectl describe svc nginx-svc -n nginx-ns
Name:              nginx-svc
Namespace:         nginx-ns
Labels:            <none>
Annotations:       Selector:  app=nginx
Type:              ClusterIP
IP:                10.101.124.84
Port:              http  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.39:80      #ip是一样的 这个service通过标签选择器选择app=nginx的pod也就是第二个模板创建的
Session Affinity:  None
Events:            <none>
[root@k8smaster service]# kubectl get pods -o wide -n nginx-ns
NAME                     READY   STATUS    RESTARTS   AGE     IP            NODE     
nginx-5957f949fc-9nwbh   1/1     Running   0          7m49s   10.244.1.39   k8snode2
[root@k8smaster service]# curl 10.101.124.84
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
#登录到 client pod 
[root@xianchaomaster1 exter]# kubectl exec -it client-849cbd69b-76hcp -- /bin/sh 
/ # wget -q -O - client-svc.default.svc.cluster.local 
wget -q -O - nginx-svc.nginx-ns.svc.cluster.local
#上面两个请求的结果一样,这个实验是为了有些情况下想通过默认命名空间下的全局限定域名到其他命名空间下的服务和服务区域通信访问。

Asignación de casos de servicios externos

El clúster k8s hace referencia a la base de datos mysql externa

node2安装mysql
[root@k8snode2 ~]# yum install mariadb-server.x86_64 -y 
[root@k8snode2 ~]# systemctl start mariadb 
[root@k8snode2 ~]# systemctl enable mariadb 
[root@k8smaster ~]# mkdir mysql
[root@k8smaster ~]# cd mysql/
[root@k8smaster mysql]# vim mysql_service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  type: ClusterIP
  ports:
  - port: 3306
[root@k8smaster mysql]# kubectl apply -f mysql_service.yaml 
service/mysql created
[root@k8smaster mysql]# kubectl get svc | grep mysql 
mysql        ClusterIP      10.103.7.164   <none>                                 3306/TCP   4s

[root@k8smaster mysql]# kubectl describe svc mysql 
Name:              mysql
Namespace:         default
Labels:            <none>
Annotations:       Selector:  <none>
Type:              ClusterIP
IP:                10.103.7.164
Port:              <unset>  3306/TCP
TargetPort:        3306/TCP
Endpoints:         <none>		#还没有 endpoint 
Session Affinity:  None
Events:            <none>
[root@k8smaster mysql]# vim mysql_endpoint.yaml        endpoint和svc的名字保持一致
apiVersion: v1
kind: Endpoints 			
metadata: 
  name: mysql
subsets: 
- addresses:  
  - ip: 192.168.40.182
  ports:  
  - port: 3306
[root@k8smaster mysql]# kubectl apply -f mysql_endpoint.yaml 
endpoints/mysql created
[root@k8smaster mysql]# kubectl describe svc mysql 
Name:              mysql
Namespace:         default
Labels:            <none>
Annotations:       Selector:  <none>
Type:              ClusterIP
IP:                10.103.7.164
Port:              <unset>  3306/TCP
TargetPort:        3306/TCP
Endpoints:         192.168.40.182:3306			#这就是定义的外部数据库
Session Affinity:  None
Events:            <none>
mysql.default.svc.cluster.local    	#这就是它的全局域名

La configuración anterior es para introducir direcciones IP y servicios externos en el clúster k8s (otros nodos) y usar el servicio como proxy para acceder a servicios externos.

escribir al final

No es fácil de crear, si crees que el contenido es útil para ti, ¡por favor dame un seguimiento de tres enlaces para apoyarme! Si hay algún error, indíquelo en los comentarios y lo cambiaré a tiempo.
La serie que se está actualizando actualmente: aprende k8s desde cero.
Gracias por mirar. El artículo se mezcla con la comprensión personal. Si hay algún error, comuníquese conmigo e indíquelo ~
inserte la descripción de la imagen aquí

おすすめ

転載: blog.csdn.net/qq_45400861/article/details/126797160