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命令查看
| 资源名称 | 缩写 | 作用描述 |
|---|---|---|
| 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三个值,默认是 Always (1)Always:每次尝试重新拉取镜像 (2)Never:表示仅使用本地镜像 (3)IfNotPresent:如果本地有镜像就是用本地镜像,没有就拉取在线镜像。 |
| 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