Kubernetes

Kubernetes是一个开源的容器编排和管理平台,用于自动化应用程序的部署、扩展和管理。

Kubernetes的设计目标是简化应用程序容器化的部署和管理。它提供了一个可靠的、可扩展的平台,可以处理容器化应用程序的自动化部署、水平扩展、负载均衡、自动修复、滚动升级等各种操作。Kubernetes还提供了一组丰富的API和工具,用于管理和监控应用程序、自动扩展和弹性调整资源、自动故障恢复和负载平衡等功能。

Kubernetes采用了容器化技术,如Docker等,来实现应用程序环境的隔离和可移植性。它可以运行在多种云计算平台上,包括公共云、私有云和混合云环境。

Kubernetes的核心概念包括:

Pod:最小的可部署单元,可以包含一个或多个容器。

Service:用于定义一组Pod的访问规则和网络连接。

ReplicaSet:用于定义Pod的副本数量和自动扩缩容规则。

Deployment:用于管理应用程序的可部署副本集。

Kubernetes还提供了许多附加功能,如持久化存储、配置管理、安全认证、日志和监控等。

总而言之,Kubernetes是一个强大的容器编排和管理平台,可以简化和自动化容器化应用程序的部署和管理,提供高可用性、可伸缩性和弹性,使开发人员和运维人员能够更轻松地构建和管理现代化的分布式应用程序。

官网:https://kubernetes.io/zh-cn/

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命令查看

资源名称缩写作用描述
nodesno集群组成部分
namespacesns命名空间,隔离Pod
podspo装载容器
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配置

常用操作

命令描述
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常用字段

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

spec主要对象

参数名字段类型说明
spec.containers[].nameString定义容器的名字
spec .containers[].imageString定义要用到的镜像的名称
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[].workingDirString指定容器的工作目录
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
Logo

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

更多推荐