• Kubernetes(k8s)的Service资源


    1、Service资源,为什么K8s要引入Service资源。

    答:运行在docker中的业务,想要被外界访问,我们需要为它做端口映射才能被访问,那么运行在k8s中的容器,为什么不能直接为它做端口映射呢?

      RC(Replication Controller)虽然保证了Pod的高可用,但是我们仅仅只能在k8s的内部访问它,但是在客户端是无法进行访问的,因为Pod的ip地址是私有ip地址,外界是无法进行访问的,而Docker中的容器是通过端口映射可以让容器中的业务被外界所访问,在k8s中,不能直接通过端口映射而被外界所访问。

    2、K8s中为什么引入了Servvice。

    答:Pod容器使用了RC(Replication Controller)来实现了高可用,此时就会出现一些问题,比如一些Pod死掉了,RC(Replication Controller)就会创建一些新的Pod,新的Pod的ip地址就变化了,此时做端口映射就发现一个很严重的问题,Ip地址发生了变化,修改规则很麻烦。在K8s中Node端口映射不可以直接映射到我们的Pod的Ip地址上面,此时K8s引入了Service(可以理解为是VIP的地址ClusterIp),VIP地址段的范围是10.254.0.0/16。

    3、K8s中三种Ip地址类型。

    答:Node ip地址、cluster ip地址、pod ip地址。

    查看K8s所有的资源,默认列出所有资源。

     1 [root@k8s-master ~]# kubectl get all
     2 NAME       DESIRED   CURRENT   READY     AGE
     3 rc/myweb   2         2         2         1d
     4 
     5 NAME             CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
     6 svc/kubernetes   10.254.0.1   <none>        443/TCP   9d
     7 
     8 NAME             READY     STATUS    RESTARTS   AGE
     9 po/myweb-8pnn0   1/1       Running   0          1d
    10 po/myweb-xkp12   1/1       Running   0          1d
    11 [root@k8s-master ~]#  

    可以在命令后面根据-o wide参数,查看pod的ip地址。可以的话,多看看k8s权威指南这本书吧,里面介绍的更加详细的。

     1 [root@k8s-master ~]# kubectl get all -o wide
     2 NAME       DESIRED   CURRENT   READY     AGE       CONTAINER(S)   IMAGE(S)                          SELECTOR
     3 rc/myweb   2         2         2         1d        myweb          192.168.110.133:5000/nginx:1.13   app=myweb
     4 
     5 NAME             CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE       SELECTOR
     6 svc/kubernetes   10.254.0.1   <none>        443/TCP   9d        <none>
     7 
     8 NAME             READY     STATUS    RESTARTS   AGE       IP            NODE
     9 po/myweb-8pnn0   1/1       Running   0          1d        172.16.5.2    k8s-node2
    10 po/myweb-xkp12   1/1       Running   0          1d        172.16.38.2   k8s-node3
    11 [root@k8s-master ~]# 

    4、在k8s中创建一个Service。

     1 # 声明api的版本。
     2 apiVersion: v1
     3 # kind代表资源的类型,资源是Service。
     4 kind: Service
     5 # 资源叫什么名字,是在其属性metadata里面的。
     6 metadata:
     7   # 第一个属性name的值是myweb,即Service的名字就叫做myweb。
     8   name: myweb
     9 # spec是详细,详细里面定义了一个容器。
    10 spec:
    11   # 类型使用的是端口映射的形式,使用端口映射进行访问。
    12   type: NodePort
    13   ports:
    14     # port端口是VIP端口即ClusterIP地址端口。
    15     - port: 80
    16       # 即宿主机的ip地址端口。映射宿主机的30000端口
    17       nodePort: 30000
    18       # 负载均衡目标端口80,即Pod的ip地址的端口。
    19       targetPort: 80
    20   # 选择器。当有多个Pod的时候,需要使用选择器选择为那些Pod做负载均衡。和RC使用的一样,是使用的标签选择器。
    21   selector:
    22     app: myweb

    创建一个svc的目录,Service资源简称是svc,然后创建一个nginx_svc.yaml配置文件。

     1 [root@k8s-master ~]# cd k8s/
     2 [root@k8s-master k8s]# ls
     3 pod  rc
     4 [root@k8s-master k8s]# mkdir svc
     5 [root@k8s-master k8s]# cd svc/
     6 [root@k8s-master svc]# ls
     7 [root@k8s-master svc]# vim nginx_svc.yaml
     8 [root@k8s-master svc]# kubectl create -f nginx_svc.yaml 
     9 service "myweb" created
    10 [root@k8s-master svc]# kubectl describe svc myweb 
    11 Name:            myweb
    12 Namespace:        default
    13 Labels:            <none>
    14 Selector:        app=myweb
    15 Type:            NodePort
    16 IP:            10.254.210.104
    17 Port:            <unset>    80/TCP
    18 NodePort:        <unset>    30000/TCP
    19 Endpoints:        172.16.38.2:80,172.16.5.2:80
    20 Session Affinity:    None
    21 No events.
    22 [root@k8s-master svc]# 

    可以看到svc的根据选择器myweb选择的Pod已经有两个Pod了,而且使用的的都是他们的80端口,使用宿主机Node的80端口号。

    此时,可以使用浏览器进行查看,此时,只要是Node的ip地址加上端口映射就可以进行访问。端口映射是k8s的kube-proxy服务进行端口映射的。

    5、K8s中Service的服务自动发现。

    可以通过命令修改RC(Replication Controller)副本控制器的副本数量,这样可以自动新增Pod的数量。

     1 [root@k8s-master svc]# kubectl get pod -o wide
     2 NAME          READY     STATUS    RESTARTS   AGE       IP            NODE
     3 myweb-8pnn0   1/1       Running   0          1d        172.16.5.2    k8s-node2
     4 myweb-xkp12   1/1       Running   0          1d        172.16.38.2   k8s-node3
     5 [root@k8s-master svc]# kubectl scale rc myweb --replicas=3
     6 replicationcontroller "myweb" scaled
     7 [root@k8s-master svc]# kubectl get pod -o wide
     8 NAME          READY     STATUS    RESTARTS   AGE       IP            NODE
     9 myweb-0x8tm   1/1       Running   0          2s        172.16.85.2   k8s-master
    10 myweb-8pnn0   1/1       Running   0          1d        172.16.5.2    k8s-node2
    11 myweb-xkp12   1/1       Running   0          1d        172.16.38.2   k8s-node3
    12 [root@k8s-master svc]# 

    此时,查看Service的详情,可以发现新增的Pod可以自动添加到负载均衡。

     1 [root@k8s-master svc]# kubectl describe svc myweb 
     2 Name:            myweb
     3 Namespace:        default
     4 Labels:            <none>
     5 Selector:        app=myweb
     6 Type:            NodePort
     7 IP:            10.254.210.104
     8 Port:            <unset>    80/TCP
     9 NodePort:        <unset>    30000/TCP
    10 Endpoints:        172.16.38.2:80,172.16.5.2:80,172.16.85.2:80
    11 Session Affinity:    None
    12 No events.
    13 [root@k8s-master svc]# 

    6、K8s中Service的负载均衡,在其内部就实现了一个简单的负载均衡。

    首先,生成一个首页,然后将首页拷贝到Pod中。

     1 [root@k8s-master svc]# kubectl get pod -o wide
     2 NAME          READY     STATUS    RESTARTS   AGE       IP            NODE
     3 myweb-0x8tm   1/1       Running   0          7m        172.16.85.2   k8s-master
     4 myweb-8pnn0   1/1       Running   0          1d        172.16.5.2    k8s-node2
     5 myweb-xkp12   1/1       Running   0          1d        172.16.38.2   k8s-node3
     6 [root@k8s-master svc]# echo 'node1' > index.html
     7 [root@k8s-master svc]# cat index.html 
     8 node1
     9 [root@k8s-master svc]# kubectl cp index.html myweb-0x8tm:/usr/share/nginx/html/index.html
    10 [root@k8s-master svc]# echo 'node2' > index.html
    11 [root@k8s-master svc]# kubectl cp index.html myweb-8pnn0:/usr/share/nginx/html/index.html
    12 [root@k8s-master svc]# echo 'node3' > index.html
    13 [root@k8s-master svc]# kubectl cp index.html myweb-xkp12:/usr/share/nginx/html/index.html
    14 [root@k8s-master svc]# 

    查看运行效果,如下所示:

    这个负载均衡会保持一段长连接,连续访问可以进行负载均衡访问,也可以使用curl进行访问。

    1 [root@k8s-master svc]# curl 192.168.110.133:30000
    2 node1
    3 [root@k8s-master svc]# curl 192.168.110.134:30000
    4 node2
    5 [root@k8s-master svc]# curl 192.168.110.135:30000
    6 node1
    7 [root@k8s-master svc]# curl 192.168.110.133:30000

    为什么负载均衡的端口(即Node的端口号)默认的端口访问是30000-32767。此默认值是可以进行修改的。修改nodeport默认范围--service-node-port-range=30000-50000。

    1 [root@k8s-master svc]# vim /etc/kubernetes/apiserver

    也可以看看api-server的启动文件的配置。

     1 [root@k8s-master svc]# cat /usr/lib/systemd/system/kube-apiserver.service 
     2 [Unit]
     3 Description=Kubernetes API Server
     4 Documentation=https://github.com/GoogleCloudPlatform/kubernetes
     5 After=network.target
     6 After=etcd.service
     7 
     8 [Service]
     9 EnvironmentFile=-/etc/kubernetes/config
    10 EnvironmentFile=-/etc/kubernetes/apiserver
    11 User=kube
    12 ExecStart=/usr/bin/kube-apiserver 
    13         $KUBE_LOGTOSTDERR 
    14         $KUBE_LOG_LEVEL 
    15         $KUBE_ETCD_SERVERS 
    16         $KUBE_API_ADDRESS 
    17         $KUBE_API_PORT 
    18         $KUBELET_PORT 
    19         $KUBE_ALLOW_PRIV 
    20         $KUBE_SERVICE_ADDRESSES 
    21         $KUBE_ADMISSION_CONTROL 
    22         $KUBE_API_ARGS
    23 Restart=on-failure
    24 Type=notify
    25 LimitNOFILE=65536
    26 
    27 [Install]
    28 WantedBy=multi-user.target
    29 [root@k8s-master svc]# 

    可以看到api-server启动的时候,后面跟了很多参数。

    修改完api-server的参数,需要重启api-server的服务。

    1 [root@k8s-master svc]# systemctl restart kube-apiserver.service 
    2 [root@k8s-master svc]# 

    此时,你可以修改修改nginx_svc.yaml配置文件里面的nodePort参数,我这里就不进行测试了。

    也可以看到VIP地址段的范围是10.254.0.0/16,也是在api-server的配置文件修改的,如下所示:

    总结,一个服务要想在k8s中运行起来,至少需要一个rc来保证高可用,其次还需要一个service可以被外界所访问。

  • 相关阅读:
    ORACLE 利用 REPLACE函数替换字段字符串
    EXCEL中对1个单元格中多个数字求和
    Oracle插入日期格式出现 ORA-01843: not a valid month的解决办法
    深入浅出设计模式——装饰模式(Decorator Pattern)
    深入浅出设计模式——组合模式(Composite Pattern)
    深入浅出设计模式——桥接模式(Bridge Pattern)
    深入浅出设计模式——适配器模式(Adapter Pattern)
    深入浅出设计模式——单例模式(Singleton Pattern)
    深入浅出设计模式——原型模式(Prototype Pattern)
    深入浅出设计模式——建造者模式(Builder Pattern)
  • 原文地址:https://www.cnblogs.com/biehongli/p/13110486.html
Copyright © 2020-2023  润新知