K8S常用资源认识

2023-11-08

一、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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

K8S常用资源认识 的相关文章

  • Kubernetes,VolumeMount 一个文件,而不是一个目录

    我将使用 K8S 来编排 docker 容器 在 k8s 中 我需要从主机目录复制一个文件 configs nginx cas server conf 到 pod 容器目录 etc nginx nginx conf 但是目前的k8s只允许挂
  • 获取 Pod 处于挂起状态的平均时间

    我正在尝试使用 prometheus 计算 pod 在 grafana 中处于挂起状态的平均时间 我可以使用此查询生成一个图表 以获取一段时间内处于挂起状态的 Pod 数量 sum kube pod status phase phase P
  • 我应该在 Kubernetes 前面添加 DMZ 吗?

    Kubernetes Ingress 是否足够安全 可以避免在 Kubernetes 前面添加 DMZ 来暴露 Pod 和服务 如果有人 黑进 Pod 会发生什么 Thanks 这是一个意见问题 所以我会用一个选项来回答 如果您遵循 这是非
  • microk8s加入节点没有效果

    我确实命令 om 主节点 microk8s add node From the node you wish to join to this cluster run the following microk8s join 192 168 0
  • K8s更改配置映射并更新应用程序日志级别

    我想更改在 K8S 上运行的 Golang 应用程序的登录配置 我在本地尝试了以下代码 它按预期工作 我正在使用 viper 来监视配置文件更改 这是带有日志配置的配置图 apiVersion v1 kind ConfigMap data
  • 如何在 Helm 图表中配置 docker 入口点

    我有以下内容docker compose文件 我不明白如何设置working dir and entrypoint在掌舵deployment yaml 有人有关于如何执行此操作的示例吗 docker compose version 3 5
  • 如何使用网络策略停止所有外部流量并仅允许命名空间内的 Pod 间网络调用?

    我正在 kubernetes 集群中设置一个命名空间 以拒绝任何传出网络调用 例如http company com http company com但允许在我的命名空间内进行 Pod 间通信 例如http my nginx http my
  • Spark 上的 Kubernetes 驱动程序 pod 清理

    我在 kubernetes 1 19 上运行 Spark 3 1 1 作业完成后 执行程序 Pod 就会被清理 但驱动程序 Pod 仍处于完成状态 驱动程序完成后如何清理 要设置任何配置选项吗 NAME READY STATUS RESTA
  • 如何在Prometheus中查询容器内存限制

    我正在使用 Prometheus 工具来监控我的 Kubernetes 集群 我在部署中设置了资源限制 内存限制 并且需要配置一个面板来显示可用的总内存 请让我知道在 Prometheus 中运行以获得可用于我的部署的总内存限制所需的查询
  • Kubernetes 集群中的 Websocket 连接与 nginx-ingress

    我正在尝试在 Kubernetes 集群中运行的服务器上建立一个简单的 Websocket 连接 Websocket 连接能够在我的本地测试计算机上建立 但在使用 nginx ingress 部署到 GKE 后 我无法将客户端连接到服务器
  • Istio:RequestAuthentication jwksUri 无法解析内部服务名称

    Notice 其根本原因与Istio 当我启用 JWT RequestAuthentication 时 运行状况检查 sidecar 失败 https stackoverflow com questions 66446178 istio h
  • kubectl 部署失败

    我正在为 GKE 上的 Spring boot 应用程序设置 CI CD 管道 CI 构建步骤工作正常 但交付构建步骤由于 错误 没有对象传递到应用 错误而失败 我可以在云构建中看到以下日志 Starting Step 0 Deploy S
  • 无法连接到代理“证书由未知机构签名”

    我正在尝试通过 Kubernetes 部署上的 cloudsql proxy 容器连接到 CloudSQL 实例 我已安装 cloudsql 凭据以及值GOOGLE APPLICATION CREDENTIALS set 但是 我的日志中仍
  • 在 Kubernetes 上部署 Spring Boot 应用程序:应用程序使用环境变量中的错误端口属性

    我正在尝试在 Kubernetes Minikube 上部署一个 Hello world Spring Boot 应用程序 该应用程序非常简单 只有一种方法 映射到 GET 资源上 我什至没有指定端口 我现在尝试在 Minikube 上部署
  • Helm 查找始终为空

    在部署 Kubernetes 应用程序时 我想检查资源是否已存在 如果是这样 则不应渲染 要存档此行为查找功能 https helm sh docs chart template guide functions and pipelines
  • kubernetes kubectl 中的生成器是什么?

    当我想通过运行生成 yaml 时kubectl 它表示我应该表示 generator something命令内的标志 例如 要通过以下方式获取部署模板kubectl 我应该运行以下命令 kubectl run generator deplo
  • 将conf文件嵌入到helm图表中

    我是新掌舵者 我正在构建一个包含大量conf文件的splunk helm图表 我目前在 configmap 中使用类似的东西 apiVersion v1 kind ConfigMap metadata name splunk master
  • Kubernetes 的调度器是如何工作的?

    Kubernetes 的调度器是如何工作的 我的意思是说Kubernetes的调度器看起来很简单 我最初的想法是这个调度器只是一个简单的准入控制系统 而不是真正的调度器 是这样正确的吗 我找到了一个简短的描述 但信息并不丰富 kuberne
  • Kubernetes - 一个 Ingress 中的多个配置

    我在同一个 Kubernetes 集群中运行不同的应用程序 我希望多个域能够访问我的 Kubernetes 集群 并根据域进行重定向 对于每个域 我想要不同的注释 配置 如果没有注释 我的入口部署如下 apiVersion networki
  • 未找到证书管理器证书并且未创建挑战

    我跟着https docs cert manager io en venafi tutorials quick start index html https docs cert manager io en venafi tutorials

随机推荐

  • 第二章:25+ Python 数据操作教程(第一节Python 中的数据结构)

    这篇文章解释了 Python 中使用的数据结构 了解编程语言中的数据结构至关重要 在 Python 中 有许多可用的数据结构 它们如下 1 字符串 2 列出 3 元组 4 词典 5 套 目录 1 字符串 2 列表 3 元组 4 字典 5 套
  • Java-Redis缓存穿透,击穿,雪崩和布隆算法

    Java Redis缓存穿透 击穿 雪崩和布隆算法 1 缓存穿透概念 2 如何解决缓存穿透 3 什么是缓存击穿 4 什么是缓存雪崩 5 导致缓存雪崩的原因 6 缓存穿透 缓存击穿 缓存雪崩的区别 1 缓存穿透概念 当一个用户想要查询数据时
  • LRU算法java实现

    1 lru简介 LRU是Least Recently Used的缩写 即最近最少使用 常用于页面置换算法 是为虚拟页式存储管理服务的 即当一个数据最近一段时间没有被访问 未来被访问的概率也很小 当空间被占满后 最先淘汰最近最少使用的数据 2
  • Android动态来改变App桌面图标

    时不时的我们就会发现 一些我们常见的应用 比如某宝 某东 在一些特殊的日子中 比如双十一 元旦 为了迎合这样一个日子的气氛 在桌面的应用图标就会发生改变 其实对于这样的一个桌面图标更换 Android中为我们提供了AndroidManife
  • spring data jpa 关联查询返回自定义对象

    Override public List
  • Linux性能检测常用的10个基本命令

    1 uptime 该命令可以大致的看出计算机的整体负载情况 load average后的数字分别表示计算机在1min 5min 15min内的平均负载 2 dmesg tail 打印内核环形缓存区中的内容 可以用来查看一些错误 上面的例子中
  • vue3组件库搭建并且发布到npm保姆教程连载一

    前言 小时候的梦想是拥有一个自己的组件库 开玩笑哈 接触前端后 很多时候在npm install的时候 我在想我们安装的这些依赖发布者是如何将依赖发布到npm 并且可以让别人使用的 未知是让人害怕的 经过一系列学习和探索后 我也拥有了自己的
  • 【python数据挖掘课程】二十六.基于SnowNLP的豆瓣评论情感分析

    这是 Python数据挖掘课程 系列文章 前面很多文章都讲解了分类 聚类算法 而这篇文章主要讲解如何调用SnowNLP库实现情感分析 处理的对象是豆瓣 肖申克救赎 的评论文本 文章比较基础 希望对你有所帮助 提供些思路 也是自己教学的内容
  • 全国青少年电子信息智能创新大赛(决赛)python·模拟三卷,含答案解析

    全国青少年电子信息智能创新大赛 决赛 python 模拟三卷 一 程序题 第一题 描述 现有 n 个人依次围成一圈玩游戏 从第 1 个人开始报数 数到第 m 个人出局 然 后从出局的下一个人开始报数 数到第 m 个人又出局 如此反复到只剩下
  • Google分布式三篇论文---BigTable

    Google s BigTable 原理 翻译 题记 google 的成功除了一个个出色的创意外 还因为有 Jeff Dean 这样的软件架构天才 官方的 Google Reader blog 中有对BigTable 的解释 这是Googl
  • TensorRT(2):TensorRT的使用流程

    TensorRT系列传送门 不定期更新 深度框架 TensorRT 文章目录 一 在线加载caffe模型 序列化保存到本地 二 反序列化直接加载保存后的trt模型 以caffe分类模型为例 简单介绍TRT的使用流程 这里不涉及量化 就以fp
  • 测试的艺术:代码检查、走查与评审

    软件开发人员通常不会考虑的一种测试形式 人工测试 大多数人都以为 因为程序是为了供机器执行而编写的 那么也该由机器来对程序进行测试 这种想法是有问题的 人工测试方法在暴露错误方面是很有成效的 实际上 大多数的软件项目都应使用到一下的人工测试
  • 详解Shell 脚本中 “$” 符号的多种用法

    通常情况下 在工作中用的最多的有如下几项 1 表示执行脚本传入参数的个数 2 表示执行脚本传入参数的列表 不包括 0 3 表示进程的id Shell本身的PID ProcessID 即脚本运行的当前 进程ID号 4 Shell最后运行的后台
  • 解决uni-toast被弹窗组件遮挡

    在App vue uni toast设置层级比popup高就行 uni toast z index 999999
  • 输入文本就可建模渲染了?!OpenAI祭出120亿参数魔法模型!

    转自 https new qq com omn 20210111 20210111A0CBRD00 html 2021刚刚开启 OpenAI又来放大招了 能写小说 哲学语录的GPT 3已经不足为奇 那就来一个多模态 图像版GPT 3 今天
  • 微信小程序事件和页面跳转

    一 页面跳转 1 非TabBar页面 一个小程序拥有多个页面 我们通过wx navigateTo进入一个新的页面 我们通过下边点击事件实现页面跳转进行代码实现及参考 wx navigateBack 回退到上一个页面 wx redirectT
  • 【单片机毕业设计】【mcuclub-310】红外遥控器

    设计简介 项目名 基于单片机的红外遥控器的设计 标准版 单片机 STC89C52 功能简介 1 利用红外发射电路 通过按不同的按键发送不同的数据值 2 利用红外接收电路 接收发送端发送的数据 3 通过数码管显示数据 资料预览 效果图 发送端
  • MiniGPT-4本地部署的实战方案

    大家好 我是herosunly 985院校硕士毕业 现担任算法研究员一职 热衷于机器学习算法研究与应用 曾获得阿里云天池比赛第一名 CCF比赛第二名 科大讯飞比赛第三名 拥有多项发明专利 对机器学习和深度学习拥有自己独到的见解 曾经辅导过若
  • Ubuntu22下OpenCV4.6.0+contrib模块编译安装

    目录 第一章 Ubuntu22下OpenCV4 6 0 contrib模块编译安装 第二章 ubuntu22下C kdevelop环境搭建 OpenCV示例 第三章 C 下OPENCV驱动调用海康GigE工业相机 文章目录 目录 Ubunt
  • K8S常用资源认识

    文章目录 一 Namespace 二 Pod 三 Label 四 Deployment 五 Service 一 Namespace namespace是kubernetes系统中的一种非常重要的资源 它的主要作用是用来实现多套环境的资源隔离