一、Namespace

namespace是kubernetes系统中的一种非常重要的资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离

默认情况下,kubernetes 集群中的所有Pod都是可以相互访问的。但是在实际中,可能不希望让Pod之间进行相互访问,此时即可将Pod划分到不同的namespace下。

Kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的“组”,以方便不同的组的资源进行隔离使用和管理。

可以通过kubernetes的授权机制,将不同的namespace交给不同租户进行管理。这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等,来实现租户可用资源的管理。

在这里插入图片描述
kubernetes在集群启动之后,会默认创建几个namespace

[root@k8s-master ~]# kubectl get namespace
NAME              STATUS   AGE
default           Active   38h   # 所有未指定Namespace的对象都会被分配在default 命名空间
kube-node-lease   Active   38h   # 集群节点之间的心跳维护,v1.13 开始引入
kube-public       Active   38h   # 此命名空间下的资源可以被所有人访问(包括未认证用户)
kube-system       Active   38h   # 所有由kubernetes 系统创建的资源都处于这个命名空间

namespace 资源的相关操作:

查看

# 查看所有的ns
[root@k8s-master ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   38h
kube-node-lease   Active   38h
kube-public       Active   38h
kube-system       Active   38h

# 查看指定的ns
# kubectl get ns ns名称
[root@k8s-master ~]# kubectl get ns default
NAME      STATUS   AGE
default   Active   38h

# 指定输出格式
# kubectl get ns ns名称 -o 格式参数
# kubernetes 支持的格式有:wide,json,yaml等
[root@k8s-master ~]# kubectl get ns default -o yaml
[root@k8s-master ~]# kubectl get ns default -o json

# 查看ns详情
[root@k8s-master ~]# kubectl describe ns default
Name:         default
Labels:       <none>
Annotations:  <none>
Status:       Active      # Active 表示命名空间正在使用中,Terminating 表示正在删除命名空间

No resource quota.   # ResourceQuota 针对namespace做的资源限制

No LimitRange resource.  # LimitRange 针对 namespace中的各个组件做的资源限制

创建

# 创建namespace
[root@k8s-master ~]# kubectl create ns test
namespace/test created
[root@k8s-master ~]# kubectl get ns test
NAME   STATUS   AGE
test   Active   76s

删除

[root@k8s-master ~]# kubectl delete ns test
namespace "test" deleted

配置方式

# 准备配置文件
[root@k8s-master ~]# vim ns-test.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: test

# 创建
[root@k8s-master ~]# kubectl apply -f ns-test.yaml
namespace/test created

# 删除
[root@k8s-master ~]# kubectl delete -f ns-test.yaml
namespace "test" deleted

二、Pod

Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中

Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器

在这里插入图片描述

kubernetes在集群启动之后,集群中的各个组件都是以pod方式运行的,查看如下:

[root@k8s-master ~]# kubectl get pod -n kube-system
NAME                                 READY   STATUS    RESTARTS   AGE
coredns-6955765f44-glr84             1/1     Running   3          39h
coredns-6955765f44-wqvp8             1/1     Running   3          39h
etcd-k8s-master                      1/1     Running   7          39h
kube-apiserver-k8s-master            1/1     Running   6          39h
kube-controller-manager-k8s-master   1/1     Running   6          39h
kube-flannel-ds-47fbn                1/1     Running   4          38h
kube-flannel-ds-jrt4p                1/1     Running   4          38h
kube-flannel-ds-zjvqd                1/1     Running   4          38h
kube-proxy-kxxk6                     1/1     Running   6          39h
kube-proxy-psqxr                     1/1     Running   6          39h
kube-proxy-tvbtt                     1/1     Running   6          39h
kube-scheduler-k8s-master            1/1     Running   7          39h

pod 资源的相关操作:

创建并运行

kubernetes没有提供单独运行Pod的命令,都是通过Pod控制器来实现的

Pod在设计支持就不是作为持久化实体的。在调度失败、节点故障、缺少资源或者节点维护的状态下都会死掉会被驱逐。

通常,用户不需要手动直接创建Pod,而是应该使用controller(例如Deployments),即使是在创建单个Pod的情况下。Controller可以提供集群级别的自愈功能、复制和升级管理。

# 命令格式: kubectl run pod控制器名称 [参数]
# --image  指定Pod的镜像
# --port   指定容器暴露的端口
# -n   指定namespace,如果不指定就默认创建在 default 命名空间中

[root@k8s-master ~]# kubectl create ns test
namespace/test created
[root@k8s-master ~]# kubectl run my-nginx --image=nginx:1.17.1 --port=80 -n test
# 确保namespace 是存在的
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/my-nginx created 
[root@k8s-master ~]# 

查看pod信息

# 查看指定命名空间下的所有pod
# kubectl get pod -n namespace
[root@k8s-master ~]# kubectl get pod -n test
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-6b7fbbc894-8z57b   1/1     Running   0          20s
# 上面的 my-nginx-6b7fbbc894-8z57b 这个pod就是由控制器my-nginx创建并管理的
[root@k8s-master ~]# kubectl get deploy -n test
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
my-nginx   1/1     1            1           37s

#查看pod更多信息
# kubectl get pod -n namespace -o wide
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME                        READY   STATUS    RESTARTS   AGE     IP           NODE         NOMINATED NODE   READINESS GATES
my-nginx-6b7fbbc894-8z57b   1/1     Running   0          5m37s   10.244.1.7   k8s-node01   <none>           <none>
# pod名称 当前pod中的容器就绪数/当前pod中的容器个数(pause根容器不计算在内) pod状态 重启次数 启动时常 pod的IP 该pod被调度到哪个节点上运行

# 查看pod的详细信息
# kubectl describe pod pod名 -n namespace
[root@k8s-master ~]# kubectl describe pod my-nginx-6b7fbbc894-4wrvc -n test

访问pod

# 获取pod的IP
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME                        READY   STATUS    RESTARTS   AGE     IP           NODE         NOMINATED NODE   READINESS GATES
my-nginx-6b7fbbc894-8z57b   1/1     Running   0          5m37s   10.244.1.7   k8s-node01   <none>           <none>
# pod的重启会导致IP变化

# 访问pod
[root@k8s-master ~]# curl 10.244.1.7:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
……省略……

删除指定pod

# kubectl delete pod pod名 -n namespace 
[root@k8s-master ~]# kubectl delete pod my-nginx-6b7fbbc894-8z57b  -n test
pod "my-nginx-6b7fbbc894-8z57b" deleted	
[root@k8s-master ~]# kubectl get pod -n test
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-6b7fbbc894-2xl4t   1/1     Running   0          6s
# 发现虽然显示删除成功,但是再查询发现立刻又重启了一个pod,这是因为使用 kubectl run 命令
# 创建的pod默认是会先创建pod控制器,再创建pod。所以此时的pod是由pod控制器管理的,控制器会
# 监控pod的状态,一旦发现pod死亡,会立即重建,这是deployment控制器的功能。
# 所以,此时要删除pod,必须删除该pod的控制器

# 查询该pod的控制器
[root@k8s-master ~]# kubectl get deploy -n test
NAME       READY   UP-TO-DATE   AVAILABLE   AGE
my-nginx   1/1     1            1           26m

# 删除该pod控制器
[root@k8s-master ~]# kubectl delete deploy my-nginx -n test
deployment.apps "my-nginx" deleted

# 稍等片刻,再查询,发现pod被删除了(对应pod的控制器被删除,那么该控制器下的pod也会相应自动被删除)
[root@k8s-master ~]# kubectl get deploy -n test
No resources found in test namespace.

配置操作

使用配置文件创建pod

[root@k8s-master ~]# vim pod-nginx.yaml
apiVersion: v1
kind: Pod   # 资源类型pod
metadata:
  name: my-nginx  # 该pod资源的名称
  namespace: test   # 位于的namespace
spec:
  containers:   # 指定该pod中镜像相关信息
  - image: nginx:1.17.1   # 镜像及版本
    imagePullPolicy: IfNotPresent   # 镜像拉取策略
    name: mypod   # 容器名称
    ports:    # 容器端口相关
    - name: nginx-port
      containerPort: 80
      protocol: TCP
# 创建
[root@k8s-master ~]# kubectl create -f pod-nginx.yaml
pod/my-nginx created

# 查看
[root@k8s-master ~]# kubectl get pod -n test
NAME       READY   STATUS    RESTARTS   AGE
my-nginx   1/1     Running   0          10s

# 删除
[root@k8s-master ~]# kubectl delete -f pod-nginx.yaml
pod "my-nginx" deleted 
# 或者使用 kubectl delete pod my-nginx -n test 进行删除,因为这种方式创建的pod为自主式pod,不会创建pod的管理器

配置文件中指定 kind为 Pod 时,那么此时创建的pod为单独的(自主式)pod,没有控制器管理的pod

三、Label

Lable是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择

Label的特点:

  • 一个Label会以 key/value 键值对(键值均为自定义)的形式附加到各种对象上,如 Node、Pod、Servie 等等
  • 一个资源对象可以定义任意数量的Lable,同一个Label也可以被添加到任意数量的资源对象上去
  • Lable通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除

可以通过Lable实现资源的多维度分组,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作

—些常用的Label示例如下:
版本标签: "version":""release", "version":"stable"......
环境标签: "environment":"dev" ,"environment":"test","environment":"pro"
架构标签: "tier":"frontend","tier"":"backend"

标签定义完毕之后,还要考虑到标签的选择,这就要使用到 Label Selector,即:

  • Label用于给某个资源对象定义标识
  • Label Selector用于查询和筛选拥有某些标签的资源对象

当前有两种Label Selector:

  • 基于等式的Label Selector
name = slave   # 选择所有包含Label中key="name"且value="slave"的对象 
env != production   # 选择所有包括Label中的 key="env" 且 value 不等于 "production" 的对象
  • 基于集合的Label Selector
name in (master,slave)    # 选择所有包含Label中的key="name"且value="master"或"slave"的对象
name notin (frontend)    # 选择所有包含Label中的key=“name"且value不等于"frontend"的对象标签的

选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号”"进行分隔即可。

例如:

name=slave,env!=production
name not in (frontend),envl=production

命令方式

[root@k8s-master ~]# kubectl get pod -n test
NAME       READY   STATUS    RESTARTS   AGE
nginxpod   1/1     Running   0          7m32s

# 为pod资源打标签
# kubectl label 资源 资源名 key=value -n namespace
[root@k8s-master ~]# kubectl label pod nginxpod version=1.0 -n test
pod/nginxpod labeled

# 查看标签
# kubectl get 资源 资源名 -n namespace --show-labels
[root@k8s-master ~]# kubectl get pod nginxpod -n test --show-labels
NAME       READY   STATUS    RESTARTS   AGE     LABELS
nginxpod   1/1     Running   0          9m16s   version=1.0

# 为pod资源更新标签
# kubectl label 资源 资源名 'key=value' -n namespace --overwrite
[root@k8s-master ~]# kubectl label pod nginxpod 'version=2.0' -n test --overwrite
pod/nginxpod labeled
[root@k8s-master ~]# kubectl get pod nginxpod -n test --show-labels
NAME       READY   STATUS    RESTARTS   AGE   LABELS
nginxpod   1/1     Running   0          10m   version=2.0

# 查看指定资源的指定标签
# kubectl get 资源 -l key=value -n namespace --show-labels
[root@k8s-master ~]# kubectl get pod -l "version=2.0" -n test
NAME       READY   STATUS    RESTARTS   AGE
nginxpod   1/1     Running   0          18m
[root@k8s-master ~]# kubectl get pod -l 'version=2.0' -n test --show-labels
# 或者 kubectl get pod -l 'version in (2.0)' -n test --show-labels
NAME       READY   STATUS    RESTARTS   AGE   LABELS
nginxpod   1/1     Running   0          18m   version=2.0

# 查看标签中 key=version 但 value 不是2.0和3.0的所有pod资源: 
# kubectl get pod -l 'version!=2.0,version!=3.0' -n test  
# 或者 kubectl get pod -l 'version notin (2.0,3.0)' -n test

# 删除标签
# kubectl label 资源 资源名 key- -n namespace
[root@k8s-master ~]# kubectl label pod nginxpod version- -n test
pod/nginxpod labeled
[root@k8s-master ~]# kubectl get pod -n test --show-labels
NAME       READY   STATUS    RESTARTS   AGE   LABELS
nginxpod   1/1     Running   0          20m   <none>

配置方式

[root@k8s-master ~]# vim lable-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: test
  labels:
    version: "4.0"
    tier: "fronted"
spec:
  containers:
  - image: nginx:1.17.1
    imagePullPolicy: IfNotPresent
    name: nginx-contain
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP
[root@k8s-master ~]# kubectl apply -f lable-pod.yaml 
pod/nginx-pod created
[root@k8s-master ~]# kubectl get pod -n test --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          16s   tier=fronted,version=4.0

四、Deployment

在kubernetes中,pod是最小的控制单元,但是kubernetes很少直接控制pod,一般都是通过Pod控制器来完成的。

Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。

在kubernetes中Pod控制器的种类有很多,Deployment 是其中一种。
在这里插入图片描述
使用Deployment 控制器创建的pod,Deployment控制器是通过给自己所创建的pod打上标签label后,从而知道自己所要管理的pod,即Deployment控制器是通过 Label 标签和 选择器 selector 与pod进行关联的

命令操作

#命令格式: kuberctl run deployment名称 [参数]
# --image 指定pod镜像
# --port 指定端口
# -n 指定ns
# --replicas pod格式,默认1个


[root@k8s-master ~]# kubectl run nginx --image=nginx:1.17.1 --port=80 --replicas=3 -n test
deployment.apps/nginx created

#同时查看pod和deploy
[root@k8s-master ~]# kubectl get deploy,pod -n test -o wide --show-labels
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES         SELECTOR    LABELS
deployment.apps/nginx   3/3     3            3           3m27s   nginx        nginx:1.17.1   run=nginx   run=nginx

NAME                         READY   STATUS    RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES   LABELS
pod/nginx-64777cd554-2h77z   1/1     Running   0          3m27s   10.244.2.10   k8s-node02   <none>           <none>            pod-template-hash=64777cd554,run=nginx
pod/nginx-64777cd554-9gwrp   1/1     Running   0          3m27s   10.244.1.13   k8s-node01   <none>           <none>            pod-template-hash=64777cd554,run=nginx
pod/nginx-64777cd554-gvw96   1/1     Running   0          3m27s   10.244.1.12   k8s-node01   <none>           <none>            pod-template-hash=64777cd554,run=nginx
# Deployment控制器是通过给自己所创建的pod打上标签label后,从而知道自己所要管理的pod

#查看deployment详情
[root@k8s-master ~]# kubectl describe deploy nginx -n test
Name:                   nginx
Namespace:              test
CreationTimestamp:      Mon, 24 May 2021 12:37:02 +0800
Labels:                 run=nginx   
# deployment控制器就是根据pod中的label,run=nginx标签来管理pod,所以在deployment控制器下的pod都会被打上run=nginx的标签
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               run=nginx
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  run=nginx
  Containers:
   nginx:
    Image:        nginx:1.17.1
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-64777cd554 (3/3 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  13m   deployment-controller  Scaled up replica set nginx-64777cd554 to 3

#删除deployment	(删除后deployment下的pod会被自动删除)
[root@k8s-master ~]# kubectl delete deploy nginx -n test
deployment.apps "nginx" deleted

配置操作

[root@k8s-master ~]# vim deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  namespace: test    # 该行及以以上定义了Deployment相关参数
spec:
  replicas: 3        # pod副本数
  selector:          # Deployment 选择器
    matchLabels: 
      app: my-nginx-pod    # pod 与 deployment 关联标签(所以在pod中需要定义该标签)
  template:         # 以下定义Pod模板
    metadata:
      labels: 
        app: my-nginx-pod
    spec:
      containers:
      - name: nginx-contain  
        image: nginx:1.17.1
        imagePullPolicy: IfNotPresent
        ports:
        - name: nginx-port
          containerPort: 80
          protocol: TCP
[root@k8s-master ~]# kubectl apply -f deploy-nginx.yaml
deployment.apps/nginx-deploy created

[root@k8s-master ~]# kubectl get deploy,pod -n test -o wide --show-labels
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS      IMAGES         SELECTOR           LABELS
deployment.apps/nginx-deploy   3/3     3            3           2m53s   nginx-contain   nginx:1.17.1   app=my-nginx-pod   <none>

NAME                                READY   STATUS    RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES   LABELS
pod/nginx-deploy-5dbf5bcdc4-ks5jl   1/1     Running   0          2m53s   10.244.2.12   k8s-node02   <none>           <none>            app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
pod/nginx-deploy-5dbf5bcdc4-q5dzk   1/1     Running   0          2m53s   10.244.1.16   k8s-node01   <none>           <none>            app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
pod/nginx-deploy-5dbf5bcdc4-sw8tj   1/1     Running   0          2m53s   10.244.2.13   k8s-node02   <none>           <none>            app=my-nginx-pod,pod-template-hash=5dbf5bcdc4

[root@k8s-master ~]# kubectl delete -f deploy-nginx.yaml
deployment.apps "nginx-deploy" deleted

五、Service

通过deployment可以创建一组pod来提供具有高可用性的服务。虽然每个pod都会分配一个ip,然而都存在以下问题:

  1. pod ip会随着pod的重建而变化
  2. pod ip仅仅是集群内可见的虚拟ip,外部都无法访问

这样对于访问这个服务带来了难度,因此,kubernetes设计 service 来解决这个问题。

service可以看作是一组同类pod对外的访问接口,借助service,应用可以方便的实现服务发现和负载均衡(类似与反向代理,对后端的pod进行代理)。
在这里插入图片描述

service控制器也是基于标签选择器机制来关联和管理对应的pod(Service与Deployment控制器一样都是通过 Label 标签和 选择器 selector 与pod进行关联的),Service在整个生命周期中IP不会改变

操作一:创建集群内部可以访问的service(ClusterIP类型)

# 创建基于deployment管理的pod
[root@k8s-master ~]# vim deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
  namespace: test    
spec:
  replicas: 3    
  selector:       
    matchLabels: 
      app: my-nginx-pod    
  template:         
    metadata:
      labels: 
        app: my-nginx-pod
    spec:
      containers:
      - name: nginx-contain  
        image: nginx:1.17.1
        imagePullPolicy: IfNotPresent
        ports:
        - name: nginx-port
          containerPort: 80
          protocol: TCP
[root@k8s-master ~]# kubectl apply -f deploy-nginx.yaml
deployment.apps/nginx-deploy created

# 查看运行状态
[root@k8s-master ~]# kubectl get deploy,pod -n test -o wide --show-labels
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS      IMAGES         SELECTOR           LABELS
deployment.apps/nginx-deploy   3/3     3            3           2m53s   nginx-contain   nginx:1.17.1   app=my-nginx-pod   <none>

NAME                                READY   STATUS    RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES   LABELS
pod/nginx-deploy-5dbf5bcdc4-ks5jl   1/1     Running   0          2m53s   10.244.2.12   k8s-node02   <none>           <none>            app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
pod/nginx-deploy-5dbf5bcdc4-q5dzk   1/1     Running   0          2m53s   10.244.1.16   k8s-node01   <none>           <none>            app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
pod/nginx-deploy-5dbf5bcdc4-sw8tj   1/1     Running   0          2m53s   10.244.2.13   k8s-node02   <none>           <none>            app=my-nginx-pod,pod-template-hash=5dbf5bcdc4

#暴露service
[root@k8s-master ~]# kubectl expose deploy nginx-deploy --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n test
service/svc-nginx1 exposed

# expose deploy nginx-deploy      将名为nginx-deploy的deployment管理器所管理的pod进行暴露
# --name                          指定Service名称
# --type                          service类型,ClusterIp这个类型是只有在集群内部才可以访问的(不指定--type 默认为ClusterIp类型);NodePort类型可以使得集群外部可以访问到service
# --port                          service 上的端口
# --target-port                   对应到pod中的容器上的端口

# 查看service
[root@k8s-master ~]# kubectl get svc -n test -o wide
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE   SELECTOR
svc-nginx1   ClusterIP   10.105.172.88   <none>        80/TCP    35s   app=my-nginx-pod
# 这里产生的ClusterIP,就是该service的IP。在service的生命周期中,这个ip地址是不会变动的
# 可以通过service这个IP访问到其后对应的三个容器中的任意一个(具体访问到哪个容器有一定的算法调度)

[root@k8s-master ~]# kubectl describe svc svc-nginx1 -n test 
Name:              svc-nginx1
Namespace:         test
Labels:            <none>
Annotations:       <none>
Selector:          app=my-nginx-pod
Type:              ClusterIP
IP:                10.105.172.88
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.16:80,10.244.2.12:80,10.244.2.13:80  # 该service后对应的三个容器地址
Session Affinity:  None
Events:            <none>

# 访问该service
[root@k8s-master ~]# curl 10.105.172.88:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

# 删除service (删除service不会影响到deploy和pod)
[root@k8s-master ~]# kubectl delete svc svc-nginx1 -n test
service "svc-nginx1" deleted

配置方式

[root@k8s-node01 ~]# kubectl get deploy -n test --show-labels
NAME           READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
nginx-deploy   3/3     3            3           77m   <none>
[root@k8s-node01 ~]# kubectl get pod -n test --show-labels
NAME                            READY   STATUS    RESTARTS   AGE   LABELS
nginx-deploy-5dbf5bcdc4-b5944   1/1     Running   0          77m   app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
nginx-deploy-5dbf5bcdc4-hxpbf   1/1     Running   0          77m   app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
nginx-deploy-5dbf5bcdc4-ll46v   1/1     Running   0          77m   app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
# 使用上面创建好的pod

# 编写配置文件 (ClusterIP类型)
[root@k8s-master ~]# vim svc-nginx3.yaml
apiVersion: v1
kind: Service
metadata:
  name: svc-nginx3
  namespace: test
spec:
  selector:
    app: my-nginx-pod
  type: ClusterIP
  clusterIP: 10.96.96.96  #  该service的IP(不写的话会自动分配,写的话要符合之前在使用 kubeadm init 命令创建集群时指定的service网段,即 --service-cidr= 参数所指定的网段)
  ports:
  - port: 80     # service端口
    protocol: TCP
    targetPort: 80   # 容器端口

# 创建
[root@k8s-master ~]# kubectl create -f svc-nginx.yaml

# 查看该svc
[root@k8s-master ~]# kubectl get svc -n test --show-labels -o wide
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE     SELECTOR           LABELS
svc-nginx3   ClusterIP   10.96.96.96   <none>        80/TCP    3m38s   app=my-nginx-pod   <none>

# 访问
[root@k8s-master ~]# curl 10.96.96.96
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
……省略……

# 删除
[root@k8s-master ~]# kubectl delete svc svc-nginx3 -n test
service "svc-nginx3" deleted

操作二:创建集群外部可以访问的Service (NodePort类型)

# 上面创建的Service的type类型为ClusterIP,这个ip地址只有集群内部可以访问
# 如果需要创建外部也可以访问的service,就需要修改type类型为NodePort

# 暴露
[root@k8s-master ~]# kubectl expose deploy nginx-deploy --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n test
service/svc-nginx2 exposed

# 查看
[root@k8s-master ~]# kubectl get svc -n test -o wide
NAME         TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE   SELECTOR
svc-nginx2   NodePort   10.102.49.10   <none>        80:30093/TCP   33s   app=my-nginx-pod
# 此时查看,会发现出现了NodePort类型的service。而且有一对port(80:30093/TCP)
[root@k8s-master ~]# kubectl describe svc svc-nginx2 -n test
Name:                     svc-nginx2
Namespace:                test
Labels:                   <none>
Annotations:              <none>
Selector:                 app=my-nginx-pod
Type:                     NodePort
IP:                       10.102.49.10
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30093/TCP
Endpoints:                10.244.1.17:80,10.244.2.14:80,10.244.2.15:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

# 接下来就可以通过集群外的主机访问 节点IP:30093访问服务了,当然内部可以使用 ClusterIP:80 也可以访问到
[root@k8s-master ~]# ifconfig ens32 | awk 'NR==2 {print $2}'
192.168.126.100
# 在windows电脑上通过浏览器访问
http://192.168.126.100:30093

# 删除service(删除service不会影响到deploy和pod)
[root@k8s-master ~]# kubectl delete svc svc-nginx2 -n test 
service "svc-nginx2" deleted

配置方式

[root@k8s-master ~]# kubectl get deploy -n test --show-labels
NAME           READY   UP-TO-DATE   AVAILABLE   AGE    LABELS
nginx-deploy   3/3     3            3           134m   <none>
[root@k8s-master ~]# kubectl get pod -n test --show-labels
NAME                            READY   STATUS    RESTARTS   AGE    LABELS
nginx-deploy-5dbf5bcdc4-b5944   1/1     Running   0          135m   app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
nginx-deploy-5dbf5bcdc4-hxpbf   1/1     Running   0          135m   app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
nginx-deploy-5dbf5bcdc4-ll46v   1/1     Running   0          135m   app=my-nginx-pod,pod-template-hash=5dbf5bcdc4
# 使用上面创建好的pod

# 编写配置文件 (NodePort类型)
[root@k8s-master ~]# vim svc-nginx4.yaml
apiVersion: v1
kind: Service
metadata:
  name: svc-nginx4  # 该service 名字
  namespace: test   # 该service 所属命名空间
spec:
  selector:
    app: my-nginx-pod  # 该service关联到具有标签 app=my-nginx-pod 的pod
  type: NodePort    # NodePort 类型
  clusterIP: 10.96.10.10   # 该service的IP(不写的话会自动分配,写的话要符合之前在使用 kubeadm init 命令创建集群时指定的service网段,即 --service-cidr 参数所指定的网段)
  ports:
  - port: 80      # 该service端口
    protocol: TCP
    targetPort: 80  # pod中容器端口
    nodePort: 30000 # 节点端口
    # 外部访问节点的3000端口会转发到service的80端口,service的80端口再转发到容器的80端口 
    
# 创建
[root@k8s-master ~]# kubectl create -f svc-nginx4.yaml 
service/svc-nginx4 created

# 查看
[root@k8s-master ~]# kubectl get svc -n test -o wide --show-labels
NAME         TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE   SELECTOR           LABELS
svc-nginx4   NodePort   10.96.10.10   <none>        80:30000/TCP   14s   app=my-nginx-pod   <none>

# 内部访问
[root@k8s-master ~]# curl 10.96.10.10
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
……省略……

# 外部访问
[root@k8s-master ~]# ifconfig ens32 | awk 'NR==2 {print $2}'
192.168.126.100
# 在windows电脑上通过浏览器访问
http://192.168.126.100:30000

# 删除 (删除service不会影响到deploy和pod)
[root@k8s-master ~]# kubectl delete -f svc-nginx4.yaml 
service "svc-nginx4" deleted
Logo

开源、云原生的融合云平台

更多推荐