【K8s】资源管理与实战入门

news2024/11/19 1:32:33

文章目录

  • 一、资源管理
    • 1、资源管理介绍
    • 2、YAML语言语法
    • 3、资源管理方式
    • 4、命令式对象管理--kubectl
    • 5、命令式对象配置
    • 6、声明式对象配置
    • 7、报错
  • 二、实战入门
    • 1、namespace
    • 2、Pod
    • 3、Label
    • 4、deployment
    • 5、Service

一、资源管理

1、资源管理介绍

在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。

kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中

kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在Pod中,而kubernetes一般也不会直接管理Pod,而是通过Pod控制器来管理Pod的。

Pod可以提供服务之后,就要考虑如何访问Pod中服务,kubernetes提供了Service资源实现这个功能。

Pod中程序的数据有的需要持久化,kubernetes还提供了各种存储系统。

在这里插入图片描述

2、YAML语言语法

YAML是一个类似 XML、JSON 的标记性语言。它强调以数据为中心,并不是以标识语言为重点。因而YAML本身的定义比较简单,号称"一种人性化的数据格式语言"。

<code9527>
    <age>23</age>
    <address>tianjin</address>
</code9527>

code9527:
  age: 23
  address: tianjin

以上两个例子,传达的信息一样,从这里可以看出yaml的"以数据为中心"。

YAML的语法比较简单,主要有下面几个:

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用tab,只允许空格( 低版本限制 )
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • '#'表示注释

YAML支持以下几种数据类型:

  • 纯量:单个的、不可再分的值
  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hash) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
# 纯量, 就是指的一个简单的值,字符串、布尔值、整数、浮点数、Null、时间、日期
# 1 布尔类型
c1: true (或者True)
# 2 整型
c2: 234
# 3 浮点型
c3: 3.14
# 4 null类型 
c4: ~  # 使用~表示null
# 5 日期类型
c5: 2018-02-17    # 日期必须使用ISO 8601格式,即yyyy-MM-dd
# 6 时间类型
c6: 2018-02-17T15:02:31+08:00  # 时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
# 7 字符串类型
c7: code     # 简单写法,直接写值 , 如果字符串中间有特殊字符,必须使用双引号或者单引号包裹 
c8: line1
    line2     # 字符串过多的情况可以拆成多行,每一行会被转化成一个空格

对象形式:

# 对象
# 形式一(推荐):
code9527:
  age: 23
  address: tianjin
# 形式二(了解):
code9527: {age: 23,address: tianjin}

数组形式:

# 数组
# 形式一(推荐):
address:
  - 滨海
  - 南开  
# 形式二(了解):
address: [滨海,南开]

需要注意的三点是:

  • 书写yaml要记得在key后面要加一个空格

  • 如果需要将多段yaml配置放在一个文件中,中间要使用—分隔

  • yaml转json的网站:https://www.json2yaml.com/convert-yaml-to-json。可以通过它验证yaml是否书写正确

3、资源管理方式

  • 命令式对象管理:直接使用命令去操作kubernetes资源
kubectl run nginx-pod --image=nginx:1.17.1 --port=80
  • 命令式对象配置:通过命令配置和配置文件去操作kubernetes资源
kubectl create/patch -f nginx-pod.yaml
  • 声明式对象配置:通过apply命令和配置文件去操作kubernetes资源
kubectl apply -f nginx-pod.yaml

三者的优缺点比较:

类型操作对象适用环境优点缺点
命令式对象管理对象测试简单只能操作活动对象,无法审计、跟踪
命令式对象配置文件开发可以审计、跟踪项目大时,配置文件多,操作麻烦
声明式对象配置目录开发支持目录操作意外情况下难以调试

4、命令式对象管理–kubectl

kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。语法:

kubectl [command] [type] [name] [flags]
----
- comand:指定要对资源执行的操作,例如create、get、delete

- type:指定资源类型,比如deployment、pod、service

- name:指定资源的名称,名称大小写敏感

- flags:指定额外的可选参数

举例:

# 查看所有pod
kubectl get pod 

# 查看某个pod
kubectl get pod pod_name

# 查看某个pod,以yaml格式展示结果
kubectl get pod pod_name -o yaml

kubernetes中所有的内容都抽象为资源,查看资源类型:

kubectl api-resources

常用资源有:

资源分类资源名称缩写资源作用
集群级别资源nodesno集群组成部分
namespacesns隔离Pod
pod资源podspo装载容器
pod资源控制器replicationcontrollersrc控制pod资源
replicasetsrs控制pod资源
deploymentsdeploy控制pod资源
daemonsetsds控制pod资源
jobs控制pod资源
cronjobscj控制pod资源
horizontalpodautoscalershpa控制pod资源
statefulsetssts控制pod资源
服务发现资源servicessvc统一pod对外接口
ingressing统一pod对外接口
存储资源volumeattachments存储
persistentvolumespv存储
persistentvolumeclaimspvc存储
配置资源configmapscm配置
secrets配置

查看可以对资源能进行哪些操作:

kubectl --help

常用的有:

命令分类命令翻译命令作用
基本命令create创建创建一个资源
edit编辑编辑一个资源
get获取获取一个资源
patch更新更新一个资源
delete删除删除一个资源
explain解释展示资源文档
运行和调试run运行在集群中运行一个指定的镜像
expose暴露暴露资源为Service
describe描述显示资源内部信息
logs日志输出容器在 pod 中的日志输出容器在 pod 中的日志
attach缠绕进入运行中的容器进入运行中的容器
exec执行容器中的一个命令执行容器中的一个命令
cp复制在Pod内外复制文件
rollout首次展示管理资源的发布
scale规模扩(缩)容Pod的数量
autoscale自动调整自动调整Pod的数量
高级命令applyrc通过文件对资源进行配置
label标签更新资源上的标签
其他命令cluster-info集群信息显示集群信息
version版本显示当前Server和Client的版本

实例:

# 创建一个namespace
[root@master ~] kubectl create namespace dev
namespace/dev created

# 获取namespace
[root@master ~] kubectl get ns
NAME              STATUS   AGE
default           Active   21h
dev               Active   21s
kube-node-lease   Active   21h
kube-public       Active   21h
kube-system       Active   21h

# 在此namespace下创建并运行一个nginx的Pod
[root@master ~] kubectl run pod --image=nginx:latest -n dev
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/pod created

# 查看新创建的pod
# 不指定ns,默认查看default命名空间下的
[root@master ~] kubectl get pod -n dev
NAME  READY   STATUS    RESTARTS   AGE
pod   1/1     Running   0          21s

# 删除指定的pod
[root@master ~] kubectl delete pod pod
pod "pod" deleted

# 删除指定的namespace
[root@master ~] kubectl delete ns dev
namespace "dev" deleted

5、命令式对象配置

即使用命令配合配置文件一起来操作kubernetes资源

  • 创建一个nginxpod.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: dev

---

apiVersion: v1
kind: Pod
metadata:
  name: nginxpod
  namespace: dev
spec:
  containers:
  - name: nginx-containers
    image: nginx:latest
  • 执行create命令,创建资源:
[root@master ~] kubectl create -f nginxpod.yaml
namespace/dev created
pod/nginxpod created
# 成功创建了两个资源对象,分别是namespace和pod
  • 查看资源,注意后面的-f xx.yaml
[root@master ~]  kubectl get -f nginxpod.yaml
NAME            STATUS   AGE
namespace/dev   Active   18s

NAME            READY   STATUS    RESTARTS   AGE
pod/nginxpod    1/1     Running   0          17s
  • 删除资源,注意后面的-f xx.yaml
[root@master ~] kubectl delete -f nginxpod.yaml
namespace "dev" deleted
pod "nginxpod" deleted

总结:

命令式对象配置的方式操作资源,可以简单的认为:kubeclt + 操作动词  +  yaml配置文件(里面是命令需要的各种参数)

6、声明式对象配置

与命令式对象配置很相似,但是它只有一个命令apply,因此只能用于新增和更新

# 首先执行一次kubectl apply -f yaml文件,发现创建了资源
[root@master ~]  kubectl apply -f nginxpod.yaml
namespace/dev created
pod/nginxpod created

# 再次执行一次kubectl apply -f yaml文件,发现说资源没有变动
[root@master ~]  kubectl apply -f nginxpod.yaml
namespace/dev unchanged
pod/nginxpod unchanged

#可以看出创建/更新资源,直接用apply更方便

总结:

其实声明式对象配置就是使用apply描述一个资源最终的状态(在yaml中定义状态)

使用apply操作资源:
    如果资源不存在,就创建,相当于 kubectl create
    如果资源已存在,就更新,相当于 kubectl patch

7、报错

在node节点上执行kubectl指令操作资源:

[root@node1 ~] kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?

kubectl的运行是需要进行配置的,它的配置文件是$HOME/.kube,因此想要在node节点运行此命令,需将master上的.kube文件复制到node节点上:

scp  -r  HOME/.kube   node1: HOME/

二、实战入门

在kubernetes集群中部署一个nginx服务,并且能够对其进行访问。先简单操作一下几个常用资源,后续章节分开整理每种资源。

1、namespace

namespace用来实现多套环境的资源隔离或者多租户的资源隔离:

  • 默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。
  • 若不想让两个pod互相访问,可将pod划分到不同的namespace

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


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

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

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

查看namespace

# 1 查看所有的ns  命令:kubectl get ns
[root@master ~] kubectl get ns
NAME              STATUS   AGE
default           Active   45h
kube-node-lease   Active   45h
kube-public       Active   45h     
kube-system       Active   45h     

# 2 查看指定的ns   命令:kubectl get ns ns名称
[root@master ~] kubectl get ns default
NAME      STATUS   AGE
default   Active   45h

# 3 指定输出格式  命令:kubectl get ns ns名称  -o 格式参数
# kubernetes支持的格式有很多,比较常见的是wide、json、yaml
[root@master ~] kubectl get ns default -o yaml
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: "2021-05-08T04:44:16Z"
  name: default
  resourceVersion: "151"
  selfLink: /api/v1/namespaces/default
  uid: 7405f73a-e486-43d4-9db6-145f1409f090
spec:
  finalizers:
  - kubernetes
status:
  phase: Active
  
# 4 查看ns详情  命令:kubectl describe ns ns名称
[root@master ~] kubectl describe ns default
Name:         default
Labels:       <none>
Annotations:  <none>
Status:       Active  # Active 命名空间正在使用中  Terminating 正在删除命名空间

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

创建namespace

# 创建namespace
[root@master ~] kubectl create ns dev
namespace/dev created

删除namespace

# 删除namespace
[root@master ~] kubectl delete ns dev
namespace "dev" deleted

以配置文件操作namespace

apiVersion: v1
kind: Namespace
metadata:
  name: dev
# 创建:
kubectl create -f ns-dev.yaml
#删除:
kubectl delete -f ns-dev.yaml

2、Pod

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

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

在这里插入图片描述
图中最下面的容器是根容器,上面的是用户容器(后面章节详解)

kubernetes在集群启动之后,集群中的各个组件也都是以Pod方式运行的

# Kubernetes系统自身创建的资源都在kube-system这个ns
[root@master ~] kubectl get pod -n kube-system
NAMESPACE     NAME                             READY   STATUS    RESTARTS   AGE
kube-system   coredns-6955765f44-68g6v         1/1     Running   0          2d1h
kube-system   coredns-6955765f44-cs5r8         1/1     Running   0          2d1h
kube-system   etcd-master                      1/1     Running   0          2d1h
kube-system   kube-apiserver-master            1/1     Running   0          2d1h
kube-system   kube-controller-manager-master   1/1     Running   0          2d1h
kube-system   kube-flannel-ds-amd64-47r25      1/1     Running   0          2d1h
kube-system   kube-flannel-ds-amd64-ls5lh      1/1     Running   0          2d1h
kube-system   kube-proxy-685tk                 1/1     Running   0          2d1h
kube-system   kube-proxy-87spt                 1/1     Running   0          2d1h
kube-system   kube-scheduler-master            1/1     Running   0          2d1h

创建pod

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

# 命令格式: kubectl run (pod控制器名称) [参数] 
# --image  指定Pod的镜像
# --port   指定端口
# --namespace  指定namespace
[root@master ~] kubectl run nginx --image=nginx:latest --port=80 --namespace dev 
deployment.apps/nginx created

查看pod的信息

# 查看Pod基本信息
# 1/1即一个容器(根容器不计算在内,默认就有)
[root@master ~] kubectl get pods -n dev
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          43s

# 查看更多,比如调度在哪个节点上运行
[root@master ~] kubectl get pods -n dev
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE
nginx   1/1     Running   0          43s   10.244.2.8   node2 
# 查看Pod的详细信息
[root@master ~] kubectl describe pod nginx -n dev
Name:         nginx
Namespace:    dev
Priority:     0
Node:         node1/192.168.5.4
Start Time:   Wed, 08 May 2021 09:29:24 +0800
Labels:       pod-template-hash=5ff7956ff6
              run=nginx
Annotations:  <none>
Status:       Running
IP:           10.244.1.23
IPs:
  IP:           10.244.1.23
Controlled By:  ReplicaSet/nginx
Containers:
  nginx:
    Container ID:   docker://4c62b8c0648d2512380f4ffa5da2c99d16e05634979973449c98e9b829f6253c
    Image:          nginx:latest
    Image ID:       docker-pullable://nginx@sha256:485b610fefec7ff6c463ced9623314a04ed67e3945b9c08d7e53a47f6d108dc7
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 08 May 2021 09:30:01 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-hwvvw (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  default-token-hwvvw:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-hwvvw
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age        From               Message
  ----    ------     ----       ----               -------
  Normal  Scheduled  <unknown>  default-scheduler  Successfully assigned dev/nginx-5ff7956ff6-fg2db to node1
  Normal  Pulling    4m11s      kubelet, node1     Pulling image "nginx:latest"
  Normal  Pulled     3m36s      kubelet, node1     Successfully pulled image "nginx:latest"
  Normal  Created    3m36s      kubelet, node1     Created container nginx
  Normal  Started    3m36s      kubelet, node1     Started container nginx

访问pod

# 获取podIP
# 注意这个IP会随着pod的重新创建而改变
[root@master ~] kubectl get pods -n dev -o wide
NAME    READY   STATUS    RESTARTS   AGE    IP             NODE    ... 
nginx   1/1     Running   0          190s   10.244.1.23   node1   ...

#访问POD
[root@master ~] curl http://10.244.1.23:80
<!DOCTYPE html>
<html>
<head>
	<title>Welcome to nginx!</title>
</head>
<body>
	<p><em>Thank you for using nginx.</em></p>
</body>
</html>

删除pod

# 删除指定Pod
[root@master ~] kubectl delete pod nginx -n dev
pod "nginx" deleted

# 此时,显示删除Pod成功,但是再查询,发现又新产生了一个 
[root@master ~] kubectl get pods -n dev
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          21s

# 这是因为当前Pod是由Pod控制器创建的,控制器会监控Pod状况,一旦发现Pod死亡,会立即重建
# 此时要想删除Pod,必须删除Pod控制器

# 先来查询一下当前namespace下的Pod控制器
[root@master ~] kubectl get deploy -n  dev
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           9m7s

# 接下来,删除此PodPod控制器
[root@master ~] kubectl delete deploy nginx -n dev
deployment.apps "nginx" deleted

# 稍等片刻,再查询Pod,发现Pod被删除了
[root@master ~] kubectl get pods -n dev
No resources found in dev namespace.

配置操作pod

创建一个pod-nginx.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
spec:
  containers:
  - image: nginx:latest
    name: pod
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP
# 创建:
kubectl create -f pod-nginx.yaml

# 删除:
kubectl delete -f pod-nginx.yaml

3、Label

Label的作用就是在资源上添加标识,用来对它们进行区分和选择。特点:

  • 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等

  • 一个资源对象可以定义任意数量的Label ,同一个Label也可以被添加到任意数量的资源对象上去

  • Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除

在这里插入图片描述

一些常用的Label 示例如下:

版本标签:"version":"release", "version":"stable"......
环境标签:"environment":"dev""environment":"test""environment":"pro"
架构标签:"tier":"frontend""tier":"backend"

给资源打上标签后,怎么按标签去挑:

  • Label用于给某个资源对象定义标识

  • Label Selector,标签选择器。用于查询和筛选拥有某些标签的资源对象

当前有两种Label Selector:

1)基于等式的Label Selector

name = slave: 选择所有包含Label中key="name"且value="slave"的对象

env != production: 选择所有包括Label中的key="env"且value不等于"production"的对象

2)基于集合的Label Selector

name in (master, slave): 选择所有包含Label中的key="name"且value="master""slave"的对象

name not in (frontend): 选择所有包含Label中的key="name"且value不等于"frontend"的对象

标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号","进行分隔即可。例如:

name=slave,env!=production

name not in (frontend),env!=production

命令方式对标签进行:增删改查

# 为pod资源打标签
[root@master ~] kubectl label pod nginx-pod version=1.0 -n dev
pod/nginx-pod labeled

# 为pod资源更新标签
[root@master ~] kubectl label pod nginx-pod version=2.0 -n dev --overwrite
pod/nginx-pod labeled

# 查看标签
[root@master ~] kubectl get pod nginx-pod  -n dev --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          10m   version=2.0

# 筛选标签
[root@master ~] kubectl get pod -n dev -l version=2.0  --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          17m   version=2.0
[root@master ~] kubectl get pod -n dev -l version!=2.0 --show-labels
No resources found in dev namespace.

#删除标签
# key-
[root@master ~] kubectl label pod nginx-pod version- -n dev
pod/nginx-pod labeled

通过配置操作标签

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
  labels:
    version: "3.0" 
    env: "test"
spec:
  containers:
  - image: nginx:latest
    name: pod
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP
# 创建对应的资源
kubectl apply -f pod-nginx.yaml

4、deployment

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

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

deployment就是控制器的一种。

在这里插入图片描述

命令方式对deployment进行:增删改查

命令格式: kubectl create deployment 名称  [参数] 

# --port   指定端口
# --replicas  指定创建pod数量
# 不同的版本run指令有出入,这个了解一下就行
[root@master ~] kubectl run nginx --image=nginx:latest --port=80 --replicas=3 -n dev
deployment.apps/nginx created

# 查看deployment的信息
[root@master ~] kubectl get deploy,pods -n dev
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           2m42s


NAME                     READY   STATUS    RESTARTS   AGE
nginx-5ff7956ff6-6k8cb   1/1     Running   0          19s
nginx-5ff7956ff6-jxfjt   1/1     Running   0          19s
nginx-5ff7956ff6-v6jqw   1/1     Running   0          19s

# UP-TO-DATE:成功升级的副本数量
# AVAILABLE:可用副本的数量
[root@master ~] kubectl get deploy -n dev -o wide
NAME    READY UP-TO-DATE  AVAILABLE   AGE     CONTAINERS   IMAGES              SELECTOR
nginx   3/3     3         3           2m51s   nginx        nginx:latest        run=nginx

# 查看deployment的详细信息
[root@master ~] kubectl describe deploy nginx -n dev
Name:                   nginx
Namespace:              dev
CreationTimestamp:      Wed, 08 May 2021 11:14:14 +0800
Labels:                 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 违规词汇
Pod Template:
  Labels:  run=nginx
  Containers:
   nginx:
    Image:        nginx:latest
    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-5ff7956ff6 (3/3 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  5m43s  deployment-controller  Scaled up replicaset nginx-5ff7956ff6 to 3
  

# 删除 
[root@master ~] kubectl delete deploy nginx -n dev
deployment.apps "nginx" deleted

使用配置文件操作deployment

创建一个deploy-nginx.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: dev
spec:
  replicas: 3  # 副本数
  selector:
    matchLabels:
      run: nginx  # 标签选择器,通过和pod的标签建立起deploy和pod的关联
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - image: nginx:latest
        name: nginx  # pod的标签
        ports:
        - containerPort: 80
          protocol: TCP
# 创建:
kubectl create -f deploy-nginx.yaml

# 删除:
kubectl delete -f deploy-nginx.yaml

5、Service

虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题:

  • Pod IP 会随着Pod的重启产生变化
  • Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问。简单说就是集群内的那几个机器能访问到这个IP。

由此,服务的访问出现困难 ⇒ Service出现。

Service可以看作是一组同类Pod对外的访问接口。 借助Service,应用可以方便地实现服务发现和负载均衡。

在这里插入图片描述

创建集群内部可访问的Service

# 暴露Service
# --port=80 --target-port=80 即访问Service的80端口转发到pod的80端口
[root@master ~] kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev
service/svc-nginx1 exposed

# 查看service
[root@master ~] kubectl get svc svc-nginx1 -n dev -o wide
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE     SELECTOR
svc-nginx1   ClusterIP   10.109.179.231   <none>        80/TCP    3m51s   run=nginx

这里产生了一个CLUSTER-IP,这就是service的IP,在Service的生命周期中,这个地址是不会变动的

# 可以通过这个IP访问当前service对应的pod
[root@master ~] curl 10.109.179.231:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body>
<h1>Welcome to nginx!</h1>
.......
</body>
</html>

注意:–type=ClusterIP指定的,service的IP也是只能在集群内部访问

创建集群外部也可访问的Service

如果需要创建外部也可以访问的Service,需要修改type为NodePort

# 上面创建的Service的type类型为ClusterIP,这个ip地址只用集群内部可访问
 
[root@master ~] kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
service/svc-nginx2 exposed

此时查看,会发现出现了NodePort类型的Service,而且有一对Port(80:31556/TC)

[root@master ~] kubectl get svc  svc-nginx2  -n dev -o wide
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE    SELECTOR
svc-nginx2    NodePort    10.106.91.234      <none>        80:31556/TCP   9s     run=nginx

来直观感受下两种type的Service的区别:

在这里插入图片描述

接下来就可以通过集群外的主机访问 节点IP:31556访问服务了

# 例如在集群外的服务器中访问下面的地址
curl 节点IP:31556/

在这里插入图片描述

删除Service

[root@master ~] kubectl delete svc svc-nginx-1 -n dev 
service "svc-nginx-1" deleted

通过配置文件操作Service

创建一个svc-nginx.yaml:

apiVersion: v1
kind: Service
metadata:
  name: svc-nginx
  namespace: dev
spec:
  clusterIP: 10.109.179.231 #type: ClusterIP,不写则随机分配
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx
  type: ClusterIP  
# 创建:
kubectl create -f svc-nginx.yaml

# 删除:
kubectl delete -f svc-nginx.yaml

到此,完成了Namespace、Pod、Deployment、Service资源的基本操作。下一篇对每种资源详细展开。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/502792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何有效的向 AI 提问 ?

文章目录 〇、导言一、Base LLM 与 Instruction Tuned LLM二、如何提出有效的问题 &#xff1f;1. 明确问题&#xff1a;2. 简明扼要&#xff1a;3. 避免二义性&#xff1a;4. 避免绝对化的问题&#xff1a;5. 利用引导词&#xff1a;6. 检查语法和拼写&#xff1a;7. 追问细节…

7天获邀请函|环境科学研究学者持加拿大麦吉尔大学Offer申报CSC

I老师要求2周内获得邀请函且指定加拿大。我们只用了7天时间就获得加拿大排名榜首的麦吉尔大学邀请函&#xff0c;整整提前了一半时间&#xff0c;效率奇高。 I老师背景&#xff1a; 申请类型&#xff1a;CSC访问学者 工作背景&#xff1a;某研究所研究人员 教育背景&#xf…

g++编译静态库与动态库

该文目的是基本理清一个在linux在c静态库与动态库的编译和使用 一个非常基础的一节&#xff0c;简单的整合了一下目前已有的文章 前提准备&#xff1a; 文件: touch SoDemoTest.h one.cpp two.cpp three.cpp main.cpp代码 /* SoDemoTest.h */ #ifndef _SO_DEMO_TEST_HEADE…

【Ubuntu22.04】内网部署Ubuntu Server 22.04.2

镜像下载 方式一&#xff1a;官网下载 https://ubuntu.com/download/server 方式二&#xff1a;清华镜像站 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04.2/ 方式三&#xff1a;百度网盘 链接: https://pan.baidu.com/s/1g24PDfAiPVsxMm7DVpERdg?pwd1020 …

myql的三种删除方式:delete truncate drop

前言 在 MySQL 中&#xff0c;删除的方法总共有 3 种&#xff1a;delete、truncate、drop&#xff0c;而三者的用法和使用场景又完全不同&#xff0c;接下来我们具体来看。 1.delete detele 可用于删除表的部分或所有数据&#xff0c;它的使用语法如下&#xff1a; delete …

独立产品灵感周刊 DecoHack #052 - 100个AI 工具导航网站

本周刊记录有趣好玩的独立产品设计开发相关内容&#xff0c;每周发布&#xff0c;往期内容同样精彩&#xff0c;感兴趣的伙伴可以 点击订阅我的周刊。为保证每期都能收到&#xff0c;建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。 ❤️ 刚换工作再加上个人原因有些自己的事…

消息队列中间件 - 详解RabbitMQ6种模式

RabbitMQ 6种工作模式 对RabbitMQ 6种工作模式(简单模式、工作模式、订阅模式、路由模式、主题模式、RPC模式)进行场景和参数进行讲解&#xff0c;PHP代码作为实例。 安装 客户端实现&#xff1a;添加扩展&#xff0c;执行composer.phar install命令 {"require":…

SSM框架学习-bean实例化

实例化bean的三种方式 1. 构造方法&#xff08;常用&#xff09; Spring创建bean调用的是无参的构造方法&#xff0c;且无论该无参构造方法是公有还是私有的&#xff0c;都可以调用&#xff08;底层实现原理为反射&#xff09; 2. 静态工厂&#xff08;了解&#xff09; 要配置…

【论文阅读-Low-code LLM】使用LLM进行可视化编程

Low-code LLM: Visual Programming over LLMs link: https://arxiv.org/abs/2304.08103 repository: https://github.com/microsoft/TaskMatrix/tree/main/LowCodeLLM 摘要 大规模预训练模型&#xff08;LLMs&#xff09;在解决困难问题仍具有很大的挑战。这篇文章提出了可以…

lua | 数据类型与变量

目录 一、数据类型 8个基本类型 1.nil(空&#xff09; 2.boolean&#xff08;布尔&#xff09; 3.number(数字&#xff09; 4.string(字符串&#xff09; 5.table&#xff08;表 &#xff09; 6.function&#xff08;函数&#xff09; 7.thread(线程&#xff09; 8.u…

FIR滤波

参考来源&#xff1a; https://www.zhihu.com/question/323353814 本节主要围绕以下几个问题进行描述&#xff1a; 什么是FIR滤波器时域的卷积频域的相乘 关于FIR FIR滤波就是在时域上卷积的过程。将含噪声信号与低通滤波器的傅里叶逆变换值进行卷积&#xff0c;这个过程就是…

29 - 打家劫舍问题

文章目录 1. 打家劫舍I2. 打家劫舍II3. 打家劫舍III(1) 暴力递归超时(2) 记忆化搜索超时(3) 动态规划 1. 打家劫舍I 动态规划&#xff1a; dp[i] max(dp[i - 2] nums[i], dp[i - 1]); class Solution { public:int rob(vector<int>& nums) {if(nums.size() 1) re…

密码学:分组密码.(块密码:是一种对称密码算法)

密码学&#xff1a;分组密码. 分组加密(Block Cipher) 又称为分块加密或块密码&#xff0c;是一种对称密码算法&#xff0c;这类算法将明文分成多个等长的块 (Block) &#xff0c;使用确定的算法和对称密钥对每组分别加密或解密。分组加密是极其重要的加密体制&#xff0c;如D…

CE游戏特例说明

1.CE修改游戏特例说明 模拟器游戏不能直接修改游戏的程序代码&#xff08;即不能直接使用代码注入的手段修改code段代码&#xff09;&#xff0c;因为游戏并非使用平台语言所写&#xff0c;只有模拟器是使用平台语言写的&#xff0c;即壳是汇编写的&#xff0c;壳用来翻译跨平台…

设计模式 -- 中介者模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

瑞芯微RK3568开发板在智慧交通行业中的应用方案

智能交通安全监测系统是通过利用高性能处理器和先进的图像处理算法&#xff0c;实现对交通场景的实时监测、分析和预警&#xff0c;以提高交通安全水平。以下是基于RK3568处理器的智能交通安全监测系统产品的应用方案&#xff1a; 视频采集与处理&#xff1a; 使用RK3568处理器…

验证码短信 API 接入指南:Java 语言示例代码

短信验证码是一种通过短信发送的验证码&#xff0c;通常用于验证用户的身份、保障账户安全和防止恶意攻击等。短信验证码已经成为现代社会中不可或缺的一部分&#xff0c;广泛应用于各种场景&#xff0c;包括用户注册和登录、找回密码等等。 为了满足企业在账户安全验证和业务…

(详解)Object.keys() Object.values() Object.entries()

目录 一、Object.keys(obj) 二、Object.values() 三、Object.entries() 一、Object.keys(obj) 参数&#xff1a;要返回其枚举自身属性的对象返回值&#xff1a;一个表示给定对象的所有可枚举属性的字符串数组 处理对象&#xff0c;返回可枚举的属性数组 let person {name:…

【机器学习实战】Python基于K均值K-means进行聚类(九)

文章目录 1 前言1.1 K-means的介绍1.2 K-means的应用 2 demo实战演示2.1 导入函数2.2 创建数据2.3 拟合聚类2.4 查看结果 3 使用高级技术评估集群性能*3.1 导入函数3.2 整合数据3.3 计算 4 讨论 1 前言 1.1 K-means的介绍 K均值&#xff08;K-means&#xff09;是一种基于距离…

改写句子的软件有哪些-免费改写文章的软件

改写句子的软件 改写句子的软件是一种广泛应用于文字处理的工具&#xff0c;其主要作用是通过对原文中的语言结构和表述方式进行调整和优化&#xff0c;以改进文章的质量和可读性。改写句子的软件广泛用于新闻报道、科学文章、学术论文、书籍等各类文本材料中&#xff0c;旨在…