不论应用程序部署在 Kubernetes 上,还是部署在非 Kubernetes 环境,根本上是相似的,都需要以下要素:
网络
持久化存储和文件挂载
可用性和冗余
应用配置
安全
可以与 Kubernetes API(Application Programming Interface 应用程序编程接口)交互,在 Kubernetes 集群中配置这些要素。Kubernetes API 是一组端点(Endpoint),通过这些端点可以查看、修改、删除 Kubernetes 资源,很多 Kubernetes 资源用来配置应用程序的部署细节。
接下来介绍一些基本的 API 端点,以便在 Kubernetes 上部署和配置应用程序。
Deployment 定义了在 Kubernetes 集群中部署应用程序所需的基本细节,如使用哪个镜像。容器镜像可以使用 docker 在本地构建,也可以使用 kaniko 在 Kubernetes 上构建。
除了指定容器镜像外,Deployment 还定义了部署应用程序的副本数。创建 Deployment 时,会生成名为 ReplicaSet 的中间资源。ReplicaSet 部署的应用程序副本数由replicas
字段定义。应用程序部署在容器中,容器被封装在 Pod 里。Pod 是 Kubernetes 中的最小单元,它包含至少一个容器。
Deployment 部署了一组 Pods(一个或多个),如果我们直接访问这些 Pods,会有很多问题,如不能进行负载均衡、Pods 更新后 IP 地址会改变。这时就需要引入另一个资源 Service 了。Service 的 IP 是固定的,功能类似负载均衡器,把流量分发到后端的 Pods 上,提供负载均衡和高可用的作用。
微服务风格的应用程序生命周期比较短暂,不具备持久化存储。然而在实际环境中,许多应用程序产生的数据,是要在容器生命周期之外,要持久化存储的。Kubernetes 通过一个子系统封装了如何提供存储以及如何使用存储的底层细节,从而解决了这一问题,用户可以通过 PersistentVolumeClaim 端点为应用程序分配持久化存储。Kubernetes 运维人员负责静态分配存储(PersistentVolume)、或使用 StorageClass 动态分配存储(它分配PersistentVolume以响应 PersistentVolumeClaim 端点)。PersistentVolume 捕获所有必需的存储细节,包括类型(例如NFS、Ceph)、存储的大小。从用户的角度无论在集群中使用哪种 PersistentVolume,都不需管理底层存储服务。利用 Kubernetes 的持久化存储功能,可以增加 Kubernetes 平台上可部署的应用程序数量。
下一节,我们来讨论如何在 Kubernetes 集群中创建资源。
在 Kubernetes 集群中部署应用程序时,需要先和 Kubernetes API 交互。在命令行界面,kubectl 是主流的 Kubernetes API 交互工具。
我们来看看 kubectl 是如何管理 Kubernetes 资源的。
kubectl 包含很多子命令,以命令式的方式创建和修改资源。下面是几个常用命令:
create
describe
edit
delete
kubectl 命令格式如下:
kubectl verb noun
verb 是 kubectl 的子命令,noun 指特定的 Kubernetes 资源。以下是创建 Deployment 资源的命令示例:
root@k8s-master01:~# kubectl create deployment my-deployment --image=busybox
deployment.apps/my-deployment created
root@k8s-master01:~#
这条命令会指示 Kubernetes API 创建一个名为 “my-deployment” 的 Deployment 资源,并使用来自 Docker Hub 的 busybox 镜像启动容器。
可以通过 kubectl describe 子命令查看 Deployment 的详细信息:
root@k8s-master01:~# kubectl describe deployment my-deployment
Name: my-deployment
Namespace: default
CreationTimestamp: Wed, 15 Sep 2021 10:34:10 +0800
Labels: app=my-deployment
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=my-deployment
Replicas: 1 desired | 1 updated | 1 total | 0 available | 1 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=my-deployment
Containers:
busybox:
Image: busybox
Port:
Host Port:
Environment:
Mounts:
Volumes:
Conditions:
Type Status Reason
---- ------ ------
Available False MinimumReplicasUnavailable
Progressing True ReplicaSetUpdated
OldReplicaSets:
NewReplicaSet: my-deployment-58bfcbdcc8 (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning ReplicaSetCreateError 64s deployment-controller Failed to create new replica set "my-deployment-58bfcbdcc8": Unauthorized
Normal ScalingReplicaSet 64s deployment-controller Scaled up replica set my-deployment-58bfcbdcc8 to 1
root@k8s-master01:~#
这条命令会格式化的输出 Deployment 的相关信息,我们可以通过这条命令查看 Deployment 的状态。
如果需要对 Deployment 进行修改,可以通过 kubectl edit 子命令:
root@k8s-master01:~# kubectl edit deployment my-deployment
这条命令将打开一个文本编辑器,你可以像使用 vim 一样修改 Deployment。
需要删除某个资源时,可以使用 kubectl delete 子命令:
root@k8s-master01:~# kubectl describe deployment my-deployment
执行此命令,会删除名为 “my-deployment” 的 Deployment 资源。
Kubernetes 资源一旦创建,会以 JSON 文件的格式存在于集群中,可以将其导出为 YAML 文件,提高可读性。YAML 格式的资源示例如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
spec:
replicas: 1
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: main
image: busybox
args:
- sleep
- infinity
这是一个简单的 YAML 示例,使用来自 Docker Hub 的 busybox 镜像,并无限期地运行 sleep 命令以保持 Pod 运行。
kubectl 是以命令式的方式创建资源的,看上去更简单一些,但在实际使用中,我们更多的是使用 YAML 格式的文件。kubectl 子命令不能配置所有的资源选项,但通过 YAML 文件可以,并且也更灵活。更重要的一点是,YAML 文件是以声明式的方式创建资源的.
在声明式创建资源时,用户首先以 YAML 格式写出要创建的资源,再使用 kubectl 工具将资源应用于 Kubernetes API。在命令式配置中,开发人员使用 kubectl 诸多子命令管理资源,而声明式配置主要依赖于 kubectl apply 子命令。
声明式配置通常使用以下命令实现:
root@k8s-master01:~# kubectl apply -f my-deployment.yaml
使用此命令,Kubernetes 会根据资源是否存在来推断要对资源执行的操作(创建或修改)。
配置声明式应用程序的步骤:
创建名为 my-deployment.yaml 的文件,并将以下 YAML 格式的内容写入该文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
spec:
replicas: 1
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: main
image: busybox
args:
- sleep
- infinity
.使用以下命令创建 Deployment
root@k8s-master01:~# kubectl apply -f my-deployment.yaml
执行此命令后,Kubernetes 将按照 YAML 内容在 default 命名空间中创建 Deployment。
如果要修改 Deployment,例如将副本数修改为 2,可以通过修改 my-deployment.yaml 文件实现:
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
spec:
replicas: 2 # 修改此处的数值
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: main
image: busybox
args:
- sleep
- infinity
4.可以通过 -f 标志指定 YAML 文件,该文件提供了要删除的资源名称,并且该文件可以反复使用