在这个场景中,学习如何使用Kubectl
创建和启动部署、复制控制器,并通过编写yaml
定义通过服务公开它们。YAML
定义定义了调度部署的Kubernetes
对象。可以更新对象并将其重新部署到集群中以更改配置。
最常见的Kubernetes
对象之一是部署对象。部署对象定义了所需的容器规范,以及Kubernetes
的其他部分用于发现和连接应用程序的名称和标签。
将下列定义复制到编辑器中。该定义定义了如何使用运行在端口80上的Docker映像katacoda/ Docker -http-server启动名为webapp1的应用程序。
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp1
spec:
replicas: 1
selector:
matchLabels:
app: webapp1
template:
metadata:
labels:
app: webapp1
spec:
containers:
- name: webapp1
image: katacoda/docker-http-server:latest
ports:
- containerPort: 80
通过命令部署到集群
$ kubectl create -f deployment.yaml
deployment.apps/webapp1 created
由于它是一个部署对象,因此可以通过以下方式获取所有部署对象的列表
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
webapp1 1/1 1 1 64s
kubectl describe deployment webapp1
可以输出单个部署的详细信息
$ kubectl describe deployment webapp1
Name: webapp1
Namespace: default
CreationTimestamp: Wed, 03 Feb 2021 15:00:24 +0000
Labels: <none>
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=webapp1
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=webapp1
Containers:
webapp1:
Image: katacoda/docker-http-server:latest
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: webapp1-6b54fb89d9 (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 90s deployment-controller Scaled up replica set webapp1-6b54fb89d9 to 1
Kubernetes
具有强大的网络功能,可以控制应用程序的通信方式。这些网络配置也可以通过YAML
来控制。
将服务定义复制到编辑器。该服务选择标签为webapp1的所有应用程序。当部署多个副本或实例时,它们将基于这个公共标签自动负载平衡。该服务通过NodePort使应用程序可用。
apiVersion: v1
kind: Service
metadata:
name: webapp1-svc
labels:
app: webapp1
spec:
type: NodePort
ports:
- port: 80
nodePort: 30080
selector:
app: webapp1
使用kubectl
以一致的方式部署所有Kubernetes
对象。
$ kubectl create -f service.yaml
service/webapp1-svc created
与前面一样,使用kubectl get svc
部署的所有服务对象的详细信息。
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7m52s
webapp1-svc NodePort 10.100.198.79 <none> 80:30080/TCP 118s
通过kubectl descibe svc webapp1-svc
获取配置的更多细节。
$ kubectl describe svc webapp1-svc
Name: webapp1-svc
Namespace: default
Labels: app=webapp1
Annotations: <none>
Selector: app=webapp1
Type: NodePort
IP: 10.100.198.79
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30080/TCP
Endpoints: 172.18.0.4:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
可以根据部署所需的不同配置更改YAML
的详细信息。这遵循了作为代码思维的基础架构。清单应该保持在源代码控制之下,并用于确保生产中的配置与源代码控制中的配置匹配。
更新部署。yaml文件,以增加运行的实例数量。例如,文件应该是这样的: replicas: 4
使用kubectl apply对现有定义进行更新。要扩展副本的数量,请使用以下命令部署更新的YAML文件
kubectl apply -f deployment.yaml
立刻,我们想要的集群状态就被更新了,可以用
kubectl get deployment
额外的Pods
将被安排以配合要求。kubectl get pod
因为所有的pod
都有相同的标签选择器,它们将在部署的服务NodePort
后进行负载平衡。向端口发出请求将导致不同的容器处理curl host01:30080
请求。
Kubernetes
的网络细节和对象定义将在后面介绍。