Kubernetes Service 学习

Kubernetes-Service 学习

部署在容器中的服务想要被外界访问到,就得做端口映射才行。但是这种方式在K8s中是无法实现的,因为每一次Pod的创建和重启其IP都会改变,而且同一个节点上的Pod可能存在多个,这个时候做端口映射是不现实的。而Service相当于我们Pod的VIP

Service的三种模式

Service有三种运行模式,其实是Service升级的三个版本。

[userspace

Client要访问Pod时,它先将请求发给本机内核空间中的service规则,由它再将请求,转给监听在指定套接字上的kube-proxy,kube-proxy处理完请求,并分发请求到指定Server Pod后,再将请求递交给内核空间中的service,由service将请求转给指定的Server Pod。

iptables

直接由内核的Iptables转发到Pod,不在进过kube-proxy。

ipvs

它是直接有内核中的ipvs规则来接受Client Pod请求,并处理该请求,再有内核封包后,直接发给指定的Server Pod。

Service的四种类型

NodePort

创建这种方式的Service,内部可以通过ClusterIP进行访问,外部用户可以通过NodeIP:NodePort的方式单独访问每个Node上的实例。

[root@kubernetes-master-01 ~]# vim svc.yaml
[root@kubernetes-master-01 ~]# cat svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30001
  selector:
    app: nginx
---
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: alvinos/django:v1
        ports:
        - containerPort: 80

[root@kubernetes-master-01 ~]# kubectl apply -f svc.yaml
service/nginx created
replicationcontroller/nginx configured
[root@kubernetes-master-01 ~]# kubectl get all
NAME              READY   STATUS              RESTARTS   AGE
pod/nginx-47s6q   0/1     ContainerCreating   0          13s
pod/nginx-kd6d6   1/1     Running             0          13s
pod/nginx-t2vqz   1/1     Running             0          13s

NAME                          DESIRED   CURRENT   READY   AGE
replicationcontroller/nginx   3         3         2       13s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        106m
service/nginx        NodePort    10.102.211.15   <none>        80:30001/TCP   13sCopy to clipboardErrorCopied
  • 测试连接

    [root@kubernetes-master-01 ~]# while true; do curl 10.102.211.15/index; echo ''; sleep 1; done
    主机名:nginx-47s6q,版本:v1
    主机名:nginx-47s6q,版本:v1
    主机名:nginx-t2vqz,版本:v1
    主机名:nginx-47s6q,版本:v1
    主机名:nginx-47s6q,版本:v1
    主机名:nginx-t2vqz,版本:v1
    主机名:nginx-47s6q,版本:v1Copy to clipboardErrorCopied
    

LoadBalancer

接入外部负载均衡器的IP,到我们的k8s上

  • 创建LoadBalancer
[root@kubernetes-master-01 ~]# cat svc.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: nginx
EOFCopy to clipboardErrorCopied
  • 查看
[root@kubernetes-node-01 ~]# kubectl get svc
NAME           TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
kubernetes     ClusterIP      10.0.0.1      <none>         443/TCP        110d
loadbalancer   LoadBalancer   10.0.129.18   81.71.12.240   80:30346/TCP   11sCopy to clipboardErrorCopied

HeadLess Service

创建一个没有IP的特殊的Cluster IP类型的Service。

  • 创建

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: nginx
              image: nginx
              ports:
                - containerPort: 80
                  name: http
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: headless-service
    spec:
      selector:
        app: nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
      clusterIP: None    Copy to clipboardErrorCopied
    
  • 查看

    [root@kubernetes-master-01 ~]# kubectl apply -f headless.yaml
    deployment.apps/nginx-deployment created
    service/headless-service created
    [root@kubernetes-master-01 ~]# kubectl get svc
    NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    headless-service   ClusterIP   None            <none>        80/TCP         4s
    kubernetes         ClusterIP   10.96.0.1       <none>        443/TCP        119m
    [root@kubernetes-master-01 ~]# kubectl describe svc headless-service
    Name:              headless-service
    Namespace:         default
    Labels:            <none>
    Annotations:       <none>
    Selector:          app=nginx
    Type:              ClusterIP
    IP:                None
    Port:              <unset>  80/TCP
    TargetPort:        80/TCP
    Endpoints:         10.244.1.5:80,10.244.1.6:80,10.244.2.6:80 + 2 more...
    Session Affinity:  None
    Events:            <none>
    
posted @ 2020-09-22 10:48  JoJoblog  阅读(155)  评论(0)    收藏  举报