Kubernetes之基本使用
- Kubernetes
-
- 主要功能
- 相关概念
- 相关组件
- 工作流程
- kubectl命令
-
- 基本使用
- 常用资源
- 常用操作
- yaml文件
-
- 语法注意事项
- 数据类型
- 生成yaml文件
- Yaml常用字段
- 资源管理
-
- 使用命令
- 使用命令 配置文件
- 使用apply命令 配置文件
- 命名空间NameSpace
-
- 命名空间概述
- NameSpace的创建
-
- 命令方式
- 配置文件
- Pod
-
- Pod概述
- Pod的基本操作
-
- 命令方式
- 配置方式
- Label
-
- Label概述
- 创建Label
-
- 命令方式
- 配置方式
- Deployment
-
- 创建Pod
- 查看Pod
- 查看deployment信息
- 删除deployment
- 配置文件
- Service
-
- 创建集群内部访问Service
- 创建集群外部访问Service
- 配置文件
Kubernetes
GitHub地址:https://github.com/kubernetes/kubernetes
主要功能
自我修复:当容器崩溃时,新容器可以在大约1秒内快速启动 弹性伸缩:根据需要自动调整集群中正在运行的容器数量 服务发现:服务可以通过自动发现找到所依赖的服务 负载平衡:当一个服务启动多个容器时,要求的负载平衡可以自动实现 版本退回:当发现新发布的程序版本有问题时,可以立即返回原版本 存储安排:根据容器本身的需要自动创建存储卷
相关概念
Master:每个集群至少需要一个集群控制节点master节点负责集群控制 Node:工作负载节点,由master这些分配容器node然后在工作节点上node节点上的docker负责容器的运行 Pod:kubernetes最小控制单元,容器运行pod中的,一个pod可以有一个或多个容器 Controller:通过控制器实现对pod开始等管理pod、停止pod、伸缩pod的数量等等 Service:pod统一的外部服务入口,以下可以维护同一类的多个pod Label:标签,对pod进行分类,同一类pod会有同样的标签 NameSpace:命名空间,用来隔离pod的运行环境
相关组件
一个kubernetes集群主要由控制节点组成(master)、工作节点(node)不同的组件将安装在每个节点上。
:负责集群的决策管理
ApiServer : 唯一的资源操作入口,接收用户输入命令,提供认证、授权、API注册和发现等机制 Scheduler : 负责集群资源度策略,负责集群资源的调度Pod调度到相应的node节点上 ControllerManager : 维护集群状态,如程序部署安排、故障检测、自动扩展、滚动更新等 Etcd:负责存储集群中各种资源对象的信息 :负责为容器提供运行环境
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的基本操作
命令方式
Pod的运行都是通过Pod控制器来实现的
命令格式:kubectl run pod控制器名称 --image:指定镜像 --port:指定端口 --namespace:指定namespace
kubectl run nginx-pod --image=nginx --port=80 --namespace test
查看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
获取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
注意:当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地址只用集群