Kubernetes之基本使用

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 Kubernetes之基本使用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

Kubernetes

GitHub地址:https://github.com/kubernetes/kubernetes

主要功能

自我修复:当某个容器崩溃时,能够在1秒左右迅速启动新的容器

弹性伸缩:根据需要,自动对集群中正在运行的容器数量进行调整

服务发现:服务可以通过自动发现的形式找到它所依赖的服务

负载均衡:当一个服务起动了多个容器,能够自动实现请求的负载均衡

版本回退:当发现新发布的程序版本有问题,可以立即回退到原来的版本

存储编排:根据容器自身的需求自动创建存储卷

相关概念

Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控

Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行

Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器

Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等

Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod

Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签

NameSpace:命名空间,用来隔离pod的运行环境

相关组件

一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件。

master:负责集群的决策管理

ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制

Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上

ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等

Etcd:负责存储集群中各种资源对象的信息

node:负责为容器提供运行环境

Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器

KubeProxy : 负责提供集群内部的服务发现和负载均衡

Docker : 负责节点上容器的各种操作

工作流程

1.当kubernetes启动后,master和node将自身的信息存储到etcd数据库中

2.一个服务的安装请求会首先被发送到master节点的apiServer组件

3.apiServer组件调用scheduler组件来决定服务安应该装到哪个node节点上;它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer

4.apiServer调用controller-manager去调度Node节点安装服务

5.kubelet接收到指令后,会通知docker,然后由docker来启动一个服务pod;pod是kubernetes的最小操作单元,容器必须跑在pod中

6.最后,一个服务就运行了,如果需要访问服务,就需要通过kube-proxy来对pod产生访问的代理,如此就可以访问集群中的服务了

kubectl命令

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

基本使用

帮助命令

kubectl --help

# 具体命令操作
kubectl get --help

命令语法

kubectl [comand] [TYPE] [NAME] [flags]
comand:指定要对资源执行的操作,例如 create、get、describe 和 delete

TYPE:指定资源类型,资源类型是大小写敏感的,开发者能够以单数、复数和缩略的形式

NAME:指定资源的名称,名称也大小写敏感的。如果省略名称,则会显示所有的资源

flags:指定可选的参数。例如,可用-s 或者–server 参数指定 Kubernetes APIserver 的地址和端口
# 查看所有pod
kubectl get pod 

# 查看某个pod
kubectl get pod pod_name

# 查看某个pod详细信息
kubectl get pod pod_name -o wide

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

常用资源

kubernetes中所有的内容都抽象为资源,使用kubectl api-resources命令查看

资源名称 缩写 作用描述
nodes no 集群组成部分
namespaces ns 命名空间,隔离Pod
pods po 装载容器
replicationcontrollers rc 控制pod资源
replicasets rs 控制pod资源
deployments deploy 控制pod资源
daemonsets ds 控制pod资源
jobs 控制pod资源
cronjobs cj 控制pod资源
horizontalpodautoscalers hpa 控制pod资源
statefulsets sts 控制pod资源
services svc 统一pod对外接口
ingress ing 统一pod对外接口
volumeattachments 存储
persistentvolumes pv 存储
persistentvolumeclaims pvc 存储
configmaps cm 配置
secrets 配置

常用操作

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

yaml文件

k8s集群中对资源管理和资源对象编排部署是通过YAML文件操作,即把需要对资源对象操作编辑到 YAML格式文件中

在k8s中,一般使用YAML格式的文件来创建符合预期期望的pod,这样的YAML文件称为资源清单

通过kubectl命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署

Yaml与Json互转验证:https://www.json2yaml.com/convert-yaml-to-json

语法注意事项

1.大小写敏感

2.使用缩进表示层级关系

3.相同层级的元素左对齐

4. '#'表示注释

5. 切记`:` 后面要加一个空格

6. 多段yaml配置放在一个文件中,中间要使用`---`分隔

数据类型

简单不可再分的值

name: dabai

age: 20

对象

# 方式一
user:
  name: dabai
  age: 22
 
# 方式二
user: {age: 22,name: dabai}

数组

# 方式一
age:
  - 20
  - 30	
# 方式二
age: [20,30]

生成yaml文件

kubectl create命令生成yaml文件

[root@node001 ~]# kubectl create deployment nginx-test --image=nginx -o  yaml --dry-run > nginx.yaml
W0320 12:19:06.186418   31199 helpers.go:535] --dry-run is deprecated and can be replaced with --dry-run=client.
[root@node001 ~]# cat nginx.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx-test
  name: nginx-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-test
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx-test
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}

kubectl get 命令导出已部署的资源yaml文件

[root@node001 ~]# kubectl get deploy
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           22h
[root@node001 ~]# kubectl get deploy nginx -o=yaml --export > deploy-nginx.yaml
Flag --export has been deprecated, This flag is deprecated and will be removed in future.
[root@node001 ~]# ls
deploy-nginx.yaml  nginx.yaml

Yaml常用字段

参数名 字段类型 说明
Version String K8S API的版本,可以用 kubectl api-version 命令查询
kind String 指的是 yaml 文件定义的资源类型和角色,比如:Pod
metadata Object 元数据对象,固定值写metadata
metadata.name String 元数据对象的名字,比如命名Pod的名字
metadata.namespace String 元数据对象的命名空间,自定义
Spec Object 详细定义对象,固定值写Spec
spec.container[] list 是Spec对象的容器列表定义,是个列表
spec.container[].name String 定义容器的名字
spec .container[] image String 定义要用到的镜像名称

spec主要对象

参数名 字段类型 说明
spec.containers[].name String 定义容器的名字
spec .containers[].image String 定义要用到的镜像的名称
spec.containers[].imagePullPo
licy
String 定义镜像拉取策略,有Always,Never,IfNotPresent三个值课选
(1)Always:意思是每次尝试重新拉取镜像
(2)Never:表示仅使用本地镜像
(3)IfNotPresent:如果本地有镜像就是用本地镜像,没有就拉取在线镜像。上面三个值都没设置的话,默认是 Always,
spec.containers[].command[] List 指定容器启动命令,因为是数组可以指定多个,不指定则使用镜像打包时使用的启动命令。
spec.containers[] args[] List 指定容器启动命令参数,因为是数组可以指定多个。
spec.containers[].workingDir String 指定容器的工作目录
spec.containers[] volumeMou
nts[]
List 指定容器内部的存储卷配置

Yaml具体如何配置可使用kubectl explain命令进行查看

kubectl explain pod

kubectl explain pod.spec

kubectl explain pod.spec.containers

资源管理

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

在kubernetes中,Pod最小管理单元而不是容器,容器都在Pod中运行

kubernetes不会直接管理Pod,而是通过Pod控制器来管理Pod

Pod提供服务后,需要考虑如何访问Pod中服务, 而kubernetes提供了Service资源实现Pod服务的访问

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

使用命令

kubectl run nginx-pod --image=nginx

使用命令+配置文件

创建vim nginx-pod.yaml配置文件

apiVersion: v1
kind: Namespace
metadata:
  name: test

---

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: test
spec:
  containers:
  - name: nginx-name
    image: nginx

创建两个资源对象,分别是namespace和pod

[k8s@administrator ~]$ kubectl create -f nginx-pod.yaml
namespace/test created
pod/nginx-pod created

查看资源

[k8s@administrator ~]$ kubectl get -f nginx-pod.yaml
NAME             STATUS   AGE
namespace/test   Active   49s

NAME            READY   STATUS    RESTARTS   AGE
pod/nginx-pod   1/1     Running   0          49s

删除资源

[k8s@administrator ~]$ kubectl delete -f nginx-pod.yaml
namespace "test" deleted
pod "nginx-pod" deleted

使用apply命令+配置文件

创建资源,如果资源不存在则创建,等价于kubectl create;如果资源存在则更新,等价于 kubectl patch

[k8s@administrator ~]$ kubectl apply -f nginx-pod.yaml
namespace/test created
pod/nginx-pod created

[k8s@administrator ~]$ kubectl apply -f nginx-pod.yaml
namespace/test unchanged
pod/nginx-pod unchanged

命名空间NameSpace

命名空间概述

命名空间namespace主要作用是用来实现多环境的资源隔离或者多租户的资源隔离。

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

默认情况下,集群中所有的Pod都可以相互访问的。但在实际中,可能想让两个Pod之间进行隔离,那么就可以将两个Pod划分到不同的namespace下,以此进行隔离使用与管理

通过kubernetes的授权机制,将不同的namespace交给不同租户管理,这样就实现了多租户的资源隔离。

kubernetes在集群启动之后,会默认创建几个namespace

[k8s@administrator root]$ kubectl get ns
NAME                   STATUS   AGE
default                Active   3d3h # 所有未指定Namespace的对象都会被分配在default命名空间
kube-node-lease        Active   3d3h  # 集群节点之间的心跳维护
kube-public            Active   3d3h # 公共的命名空间,该空间下的资源可以被所有人访问(包括未认证用户)
kube-system            Active   3d3h # 所有由Kubernetes系统创建的资源都处于这个命名空间

NameSpace的创建

命令方式

# 创建一个namespace
[k8s@administrator root]$ kubectl create namespace test
namespace/test created

# 查看namespace
[k8s@administrator root]$ kubectl get ns
NAME                   STATUS   AGE
default                Active   3d3h
kube-node-lease        Active   3d3h
kube-public            Active   3d3h
kube-system            Active   3d3h
test                   Active   8s

# 创建并运行一个nginx的Pod资源
[k8s@administrator root]$ kubectl run nginx-pod --image=nginx -n test
pod/nginx-pod created

# 查看test命名空间下新创建的pod
[k8s@administrator root]$ kubectl get pod -n test
NAME        READY   STATUS    RESTARTS   AGE
nginx-pod   1/1     Running   0          8s

# 查看默认namespace中的资源
[k8s@administrator root]$ kubectl get pods
No resources found in default namespace.

# 删除指定的pod
[k8s@administrator root]$ kubectl delete pod nginx-pod -n test
pod "nginx-pod" deleted

# 删除命名空间
[k8s@administrator root]$ kubectl delete ns test
namespace "test" deleted

# 查看命名空间
[k8s@administrator root]$ kubectl get ns
NAME                   STATUS   AGE
default                Active   3d3h
kube-node-lease        Active   3d3h
kube-public            Active   3d3h
kube-system            Active   3d3h

# 查看某个NS,同时指定输出格式,常用格式:wide、json、yaml
[k8s@administrator ~]$ kubectl get ns default -o json
{
    "apiVersion": "v1",
    "kind": "Namespace",
    "metadata": {
        "creationTimestamp": "2022-03-21T09:00:52Z",
        "labels": {
            "kubernetes.io/metadata.name": "default"
        },
        "name": "default",
        "resourceVersion": "212",
        "uid": "2c41f796-922b-426c-a5f4-78627e008e6b"
    },
    "spec": {
        "finalizers": [
            "kubernetes"
        ]
    },
    "status": {
        "phase": "Active"
    }
}

# 查看ns详情
[k8s@administrator ~]$ kubectl describe ns default
Name:         default
Labels:       kubernetes.io/metadata.name=default
Annotations:  <none>
Status:       Active

No resource quota.

No LimitRange resource.

配置文件方式

vim ns-test.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: test

创建/删除命名空间

kubectl  create/delete   -f  s-test.yaml

Pod

Pod概述

Pod是kubernetes集群进行管理的最小单元,程序运行在部署在容器中,容器又必须存在于Pod中,一个Pod中可以存在一个或者多个容器。

Pod中容器分类:

1.用户程序所在的容器

2.Pause容器,每个Pod都会有的一个根容器

Pause容器的作用:

1.评估整个Pod的健康状态

2.根容器上设置Ip地址(Pod IP),其它容器都使用这个Ip,以此实现Pod内部的网路通信

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

[k8s@administrator ~]$ kubectl get pod -n kube-system
NAME                               READY   STATUS    RESTARTS       AGE
coredns-64897985d-74rsj            1/1     Running   3 (2d4h ago)   3d4h
etcd-minikube                      1/1     Running   3 (2d4h ago)   3d4h
kube-apiserver-minikube            1/1     Running   3 (2d4h ago)   3d4h
kube-controller-manager-minikube   1/1     Running   3 (2d4h ago)   3d4h
kube-proxy-6nf68                   1/1     Running   3 (2d4h ago)   3d4h
kube-scheduler-minikube            1/1     Running   3 (2d4h ago)   3d4h
storage-provisioner                1/1     Running   7 (24h ago)    3d4h

Pod的基本操作

命令方式

1.创建并运行

Pod的运行都是通过Pod控制器来实现的

命令格式:kubectl run pod控制器名称 --image:指定镜像 --port:指定端口 --namespace:指定namespace

kubectl run nginx-pod --image=nginx --port=80 --namespace test

2.查看pod信息

查看pod基本信息

READY 1/2 : 表示当前Pod中有1个容器,其中1个准备就绪,1个未就绪

RESTARTS  3 : 重启次数,因为有1个容器故障,Pod一直在重启试图恢复它
[k8s@administrator ~]$ kubectl get pods -n test
NAME        READY   STATUS    RESTARTS   AGE
nginx-pod   1/1     Running   0 

查看pod内部详细信息

[k8s@administrator ~]$ kubectl describe pod nginx-pod -n test
Name:         nginx-pod
Namespace:    test
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Thu, 24 Mar 2022 21:01:00 +0800
Labels:       <none>
Annotations:  <none>
Status:       Running
IP:           172.17.0.3
IPs:
  IP:  172.17.0.3
Containers:
  nginx-name:
    Container ID:   docker://d142bf978dacfccf4d5a965fbc5c483bbbdc5f8ee76c63b00bb6b4178506587a
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:4ed64c2e0857ad21c38b98345ebb5edb01791a0a10b0e9e3d9ddde185cdbd31a
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Thu, 24 Mar 2022 21:01:05 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-9cw6j (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  kube-api-access-9cw6j:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  33m   default-scheduler  Successfully assigned test/nginx-pod to minikube
  Normal  Pulling    33m   kubelet            Pulling image "nginx"
  Normal  Pulled     33m   kubelet            Successfully pulled image "nginx" in 2.99067195s
  Normal  Created    33m   kubelet            Created container nginx-name
  Normal  Started    33m   kubelet            Started container nginx-name

3.访问Pod

获取PodIP

[k8s@administrator ~]$ kubectl get pods -n test -o wide
NAME        READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
nginx-pod   1/1     Running   0          34m   172.17.0.3   minikube   <none>           <none>

访问Pod

curl http://172.17.0.3:80

4.删除指定Pod

注意:当Pod是由Pod控制器创建时,控制器会监控Pod状况,一旦发现Pod死亡,会立即重建,此时要想删除Pod,必须删除Pod控制器

## 删除指定Pod
kubectl delete pod nginx-pod -n test

# 查询当前namespace下的Pod控制器
kubectl get deploy -n  test

# 删除此PodPod控制器
kubectl delete deploy nginx-pod -n test
[k8s@administrator root]$  kubectl get pods -n dev
NAME                         READY   STATUS    RESTARTS   AGE
nginx-pod-6d99999569-5hc7f   1/1     Running   0          28s
nginx-pod-6d99999569-84wfv   1/1     Running   0          28s
nginx-pod-6d99999569-g274q   1/1     Running   0          28s
[k8s@administrator root]$ kubectl delete pod nginx-pod-6d99999569-5hc7f -n dev
pod "nginx-pod-6d99999569-5hc7f" deleted
^[[A^[[A[k8s@administrator kubectl get pods -n dev
NAME                         READY   STATUS    RESTARTS   AGE
nginx-pod-6d99999569-84wfv   1/1     Running   0          57s
nginx-pod-6d99999569-g274q   1/1     Running   0          57s
nginx-pod-6d99999569-n8t29   1/1     Running   0          5s

配置方式

创建vim nginx-pod.yaml配置文件

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: test
spec:
  containers:
  - image: nginx
    name: pod-name
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP

创建和删除

kubectl  create/delete -f  nginx-pod.yaml

Label

Label概述

Label的作用就是在资源上添加标识,用来对资源进行区分和选择。通过Label实现资源的多维度分组,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。

Label的特点:

1.一个Label以key/value键值对的形式附加到各种资源对象上

2.一个资源对象可以定义任意数量的Label

3.同一个Label可以被添加到任意数量的资源对象上去

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

标签的选择(Label Selector):用于查询和筛选拥有某些标签的资源对象

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

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

env_rolein (dev, test): 选择所有包含Label中的key="env_rolein"且value="dev""test"的对象

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

env_rolein=dev,env_rolein!=prod :标签组合,使用逗号","分隔

env_rolein not in (dev),env!=prod :标签组合,使用逗号","分隔

创建Label

命令方式

创建名称空间

kubectl create ns dev

资源打标签

 kubectl label pod nginx-pod version=1.0 -n dev 

资源更新标签

kubectl label pod nginx-pod version=2.0 --overwrite -n dev 

查看标签

kubectl get pod nginx-pod  --show-labels -n dev 

筛选标签

kubectl get pod  -l version=2.0  --show-labels -n dev 
kubectl get pod  -l version!=2.0  --show-labels -n dev 

删除标签

kubectl label pod nginx-pod version- -n dev 

配置方式

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: dev
  labels:
    version: "1.0" 
    env: "dev"
spec:
  containers:
  - image: nginx
    name: pod-name
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP

创建和删除

kubectl  create/delete   -f  nginx-pod.yaml

kubectl  apply  -f  nginx-pod.yaml

Deployment

Pod是最小的控制单元,Pod控制器用于pod的管理,Pod控制器有多个。

语法格式:
kubectl create deployment deployment名称 --image:指定镜像 --port:指定端口 --replicas:指定创建pod数量 --namespace:指定namespace

创建Pod

[k8s@administrator root]$ kubectl create deployment nginx-pod  --image=nginx  --port=80 --replicas=3 -n dev
deployment.apps/nginx-pod created

查看Pod

[k8s@administrator root]$  kubectl get pods -n dev
NAME                         READY   STATUS    RESTARTS   AGE
nginx-pod-6d99999569-bxllr   1/1     Running   0          34s
nginx-pod-6d99999569-ctr2j   1/1     Running   0          34s
nginx-pod-6d99999569-dtxkc   1/1     Running   0          34s

查看deployment信息

[k8s@administrator root]$ kubectl get deploy -n dev
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
nginx-pod   3/3     3            3           66s
[k8s@administrator root]$ kubectl get deploy -n dev -o wide
NAME        READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES   SELECTOR
nginx-pod   3/3     3            3           94s   nginx        nginx    app=nginx-pod

查看deployment详细信息

[k8s@administrator root]$ kubectl describe deploy nginx -n dev
Name:                   nginx-pod
Namespace:              dev
CreationTimestamp:      Fri, 25 Mar 2022 16:19:20 +0800
Labels:                 app=nginx-pod
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=nginx-pod
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:  app=nginx-pod
  Containers:
   nginx:
    Image:        nginx
    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-pod-6d99999569 (3/3 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  107s  deployment-controller  Scaled up replica set nginx-pod-6d99999569 to 3

删除deployment

注意:当Pod是由Pod控制器创建时,控制器会监控Pod状况,一旦发现Pod死亡,会立即重建,此时要想删除Pod,必须删除Pod控制器

[k8s@administrator root]$  kubectl get pods -n dev
NAME                         READY   STATUS    RESTARTS   AGE
nginx-pod-6d99999569-5hc7f   1/1     Running   0          28s
nginx-pod-6d99999569-84wfv   1/1     Running   0          28s
nginx-pod-6d99999569-g274q   1/1     Running   0          28s
[k8s@administrator root]$ kubectl delete pod nginx-pod-6d99999569-5hc7f -n dev
pod "nginx-pod-6d99999569-5hc7f" deleted
^[[A^[[A[k8s@administrator kubectl get pods -n dev
NAME                         READY   STATUS    RESTARTS   AGE
nginx-pod-6d99999569-84wfv   1/1     Running   0          57s
nginx-pod-6d99999569-g274q   1/1     Running   0          57s
nginx-pod-6d99999569-n8t29   1/1     Running   0          5s
[k8s@administrator root]$ kubectl delete deploy nginx-pod -n dev
deployment.apps "nginx-pod" deleted

配置文件方式

创建vim deployment-nginx.yaml配置文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nginx
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-labels
  template:
    metadata:
      labels:
        app: nginx-labels
    spec:
      containers:
      - image: nginx
        name: nginx-name
        ports:
        - containerPort: 80
          protocol: TCP

创建/删除/创建与更新

kubectl  create/delete/apply   -f  deploy-nginx.yaml
[k8s@administrator ~]$ kubectl  get pods -n dev --show-labels
NAME                                READY   STATUS    RESTARTS   AGE     LABELS
deployment-nginx-7bdc8c54cf-8vfcl   1/1     Running   0          2m48s   app=nginx-labels,pod-template-hash=7bdc8c54cf
deployment-nginx-7bdc8c54cf-q4t6c   1/1     Running   0          2m48s   app=nginx-labels,pod-template-hash=7bdc8c54cf
deployment-nginx-7bdc8c54cf-sc9qv   1/1     Running   0          2m48s   app=nginx-labels,pod-template-hash=7bdc8c54cf

Service

每个Pod都会分配一个独立的IP,Pod的IP会随着Pod的重建而变化,Pod的IP仅仅是集群内可见的虚拟IP,外部无法访问,若想外部访问就需要使用Service。

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

创建集群内部访问的Service

deployment控制器创建Pod

[k8s@administrator ~]$  kubectl create deployment nginx-deployment --image=nginx --port=80
deployment.apps/nginx-deployment created

暴露Service

创建的Service的type类型为ClusterIP,这个ip地址只用集群内部访问

[k8s@administrator ~]$ kubectl expose deployment nginx-deployment  --name=nginx-svc --type=ClusterIP --port=80 --target-port=80
service/nginx-svc exposed

查看service

[k8s@administrator ~]$ kubectl get svc nginx-svc  -o wide
NAME        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE   SELECTOR
nginx-svc   ClusterIP   10.102.17.212   <none>        80/TCP    10s   app=nginx-deployment

ClusterIP就是service的IP,在Service的生命周期中,地址是不会变动的,通过这个IP访问当前service对应的Pod

[k8s@administrator ~]$ curl 10.102.17.212:80

删除service

[k8s@administrator ~]$ kubectl delete svc nginx-svc
service "nginx-svc" deleted

创建集群外部访问的Service

创建Pod

[k8s@administrator ~]$ kubectl create deployment nginx-deployment --image=nginx --port=80
deployment.apps/nginx-deployment created

创建service

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

[k8s@administrator ~]$ kubectl expose deployment nginx-deployment  --name=nginx-svc --type=NodePort --port=80 --target-port=80
service/nginx-svc exposed

查看service

[k8s@administrator ~]$ kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        18h
nginx-svc    NodePort    10.103.52.43   <none>        80:31449/TCP   15s
[k8s@administrator ~]$ kubectl get svc  nginx-svc   -o wide
NAME        TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE   SELECTOR
nginx-svc   NodePort   10.103.52.43   <none>        80:31449/TCP   41s   app=nginx-deployment

NodePort类型的Service,会有一对Port:80:31449/TCP

通过外网或集群外主机访问节点IP:31449就可以访问到内网或集群服务了

http://IP:31449

配置文件方式

vim nginx-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: default
spec:
  clusterIP: 10.102.17.212
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx-deployment
  type: ClusterIP

创建、更新、删除service

[k8s@administrator ~]$ kubectl  create  -f  nginx-svc.yaml
service/nginx-svc created

[k8s@administrator ~]$ kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   18h
nginx-svc    ClusterIP   10.102.17.212   <none>        80/TCP    10s

[k8s@administrator ~]$ kubectl  delete -f  nginx-svc.yaml

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136985.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!