几个kubernetes知识点

  • pods = pod+pod+pod+···
  • 每个pod在工作节点(worker)上,并且每个pod在全局k8s集群中有唯一的IP地址,此IP是k8s集群内部控制生成的虚拟IP,外网是无法ping通pod的ip
  • 一个pod可以有多个(>=1)容器,但是单个pod内部的容器之间对外开放的端口号必须唯一,因为pod内部的容器之间可以通过localhost直接访问
  • 如果外网需要访问pod内部的容器服务,那么就需要k8s建立一组网络服务映射,连接内外部网络。

使用k8s部署nginx并外网访问

1. 写在前面:自己的k8s集群信息

  • 共两台linux,master为集群管理角色,worker为集群实际工作角色
  • master:192.168.192.131
  • worker:192.168.192.131、192.168.192.132

2. 创建namespase.yaml

apiVersion: v1 #类型为Namespace
kind: Namespace  #类型为Namespace
metadata:
  name: ssx  #命名空间名称
  labels:
    name: ssx  

kubectl create -f namespase.yaml
kubectl get namespace

3.创建deployment.yaml 创建service.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx #为该Deployment设置key为app,value为nginx的标签
  name: ssx-nginx-dm
  namespace: ssx
spec:
  replicas: 1
  selector: #标签选择器,与上面的标签共同作用
    matchLabels:
      app: nginx #选择包含标签app:nginx的资源
  template:  #这是选择或创建的Pod的模板
    metadata: #Pod的元数据
      labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
        app: nginx
    spec: #期望Pod实现的功能(即在pod中部署)
      containers: #生成container,与docker中的container是同一种
        - image: 'node102:5000/ssx-nginx:v1.0'
          imagePullPolicy: IfNotPresent
          name: ssx-nginx-c
          ports:
            - containerPort: 80 # 开启本容器的80端口可访问
            - containerPort: 81 # 开启本容器的81端口可访问
            - containerPort: 82
            - containerPort: 83
            - containerPort: 85
            - containerPort: 86
            - containerPort: 87
            - containerPort: 88
            - containerPort: 89
            - containerPort: 91
            - containerPort: 92
            - containerPort: 93
            - containerPort: 94
          volumeMounts:
            - mountPath: /etc/localtime
              name: c-v-path
            - mountPath: /etc/nginx/conf.d
              name: c-v-path-ng
      hostAliases:
        - hostnames:
            - node101
          ip: 192.168.0.101
        - hostnames:
            - node102
          ip: 192.168.0.102
        - hostnames:
            - node103
          ip: 192.168.0.103
      nodeSelector:
        kubernetes.io/hostname: node101
      restartPolicy: Always
      volumes:
        - hostPath:
            path: /etc/localtime
            type: ''
          name: c-v-path
        - hostPath:
            path: /home/app/apps/k8s/for_docker_volume/nginx
            type: ''
          name: c-v-path-ng

---

apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: ssx-nginx-sv
  namespace: ssx
spec:
  externalTrafficPolicy: Local #仅当pod和service在同一台物理机,用于获取用户IP
  ports:
    - name: ssx-nginx-last80
      nodePort: 31080 #外网访问的端口
      port: 9080
      protocol: TCP
      targetPort: 80 # 容器nginx对外开放的端口 上面的dm已经指定了
    - name: ssx-nginx-last81
      nodePort: 31081 #外网访问的端口
      port: 9081
      protocol: TCP
      targetPort: 81 # 容器nginx对外开放的端口 上面的dm已经指定了
    - name: ssx-nginx-last82
      nodePort: 31082 #外网访问的端口
      port: 9082
      protocol: TCP
      targetPort: 82 # 容器nginx对外开放的端口 上面的dm已经指定了
    - name: ssx-nginx-last83
      nodePort: 31083 #外网访问的端口
      port: 9083
      protocol: TCP
      targetPort: 83 # 容器nginx对外开放的端口 上面的dm已经指定了
    - name: ssx-nginx-last84
      nodePort: 31084 #外网访问的端口
      port: 9084
      protocol: TCP
      targetPort: 84 # 容器nginx对外开放的端口 上面的dm已经指定了
    - name: ssx-nginx-last85
      nodePort: 31085 #外网访问的端口
      port: 9085
      protocol: TCP
      targetPort: 85 # 容器nginx对外开放的端口 上面的dm已经指定了
    - name: ssx-nginx-last86
      nodePort: 31086 #外网访问的端口
      port: 9086
      protocol: TCP
      targetPort: 86 # 容器nginx对外开放的端口 上面的dm已经指定了
    - name: ssx-nginx-last87
      nodePort: 31087 #外网访问的端口
      port: 9087
      protocol: TCP
      targetPort: 87 # 容器nginx对外开放的端口 上面的dm已经指定了
    - name: ssx-nginx-last88
      nodePort: 31088 #外网访问的端口
      port: 9088
      protocol: TCP
      targetPort: 88 # 容器nginx对外开放的端口 上面的dm已经指定了
    - name: ssx-nginx-last89
      nodePort: 31089 #外网访问的端口
      port: 9089
      protocol: TCP
      targetPort: 89 # 容器nginx对外开放的端口 上面的dm已经指定了
    - name: ssx-nginx-last91
      nodePort: 31091 #外网访问的端口
      port: 9091
      protocol: TCP
      targetPort: 91 # 容器nginx对外开放的端口 上面的dm已经指定了
    - name: ssx-nginx-last92
      nodePort: 31092 #外网访问的端口
      port: 9092
      protocol: TCP
      targetPort: 92 # 容器nginx对外开放的端口 上面的dm已经指定了
    - name: ssx-nginx-last93
      nodePort: 31093 #外网访问的端口
      port: 9093
      protocol: TCP
      targetPort: 93 # 容器nginx对外开放的端口 上面的dm已经指定了
    - name: ssx-nginx-last94
      nodePort: 31094 #外网访问的端口
      port: 9094
      protocol: TCP
      targetPort: 94 # 容器nginx对外开放的端口 上面的dm已经指定了
  selector:
    app: nginx
  type: NodePort


  • 查询ssx-nginx-ns命名空间下的pods
    kubectl get pods -n ssx -o wide
    [root@node131 ~]# kubectl get pods -n ssx -o wide
    	NAME                            READY   STATUS    RESTARTS   AGE   IP              NODE      NOMINATED NODE   READINESS GATES
    	ssx-nginx-dm-76ddccf49c-65d82   1/1     Running   0          10m   10.234.240.29   node131   <none>           <none>
    	ssx-nginx-dm-76ddccf49c-lwtls   1/1     Running   0          10m   10.234.4.45     node132   <none>           <none>
    
  • 此时查询集群的pods:新增一个ssx-nginx-dm,并且该pod的ip地址是10.234.x.x
    并且外网无法访问nginx服务,但是同一个pod中的其他容器可以通过localhost:80来访问nginx

5. 在外网打开浏览器 http://192.168.192.132:31090

即可实现访问nginx


end

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐