如何使用Kubectl
创建和启动部署、复制控制器,并通过服务公开它们,而不需要编写yaml
定义。快速地将容器启动到集群中。
首先,我们需要启动一个Kubernetes
集群。
执行命令minikube start——wait=false
启动集群组件并下载Kubectl CLI
。
$ minkube start --wait=false
minkube: command not found
$ minikube start --wait=false
* minikube v1.8.1 on Ubuntu 18.04
* Using the none driver based on user configuration
* Running on localhost (CPUs=2, Memory=2460MB, Disk=145651MB) ...
* OS release is Ubuntu 18.04.4 LTS
* Preparing Kubernetes v1.17.3 on Docker 19.03.6 ...
- kubelet.resolv-conf=/run/systemd/resolve/resolv.conf
* Launching Kubernetes ...
* Enabling addons: default-storageclass, storage-provisioner
* Configuring local host environment ...
* Done! kubectl is now configured to use "minikube"
通过命令kubectl get nodes
,检查、等待节点就绪。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube NotReady master 14s v1.17.3
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready master 18s v1.17.3
run
命令根据指定的参数(如映像或副本)创建部署。这个部署被分发给Kubernetes
主机,由它启动所需的Pods和containers
。
Kubectl run_
与docker run
类似,但他是在集群级别。
命令格式为:
kubectl run <部署名称> <properties>
命令:
kubectl run http——image=katacoda/docker-http-server:latest——replicas=1
将启动一个名为http
的部署,基于Docker映像katacoda/ Docker -http-server:latest
启动一个容器。
$ kubectl run http --image=katacoda/docker-http-server:latest --replicas=1
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/http created
然后使用kubectl get deployments
来查看部署的状态。
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
http 1/1 1 1 20s
kubectl describe deployment http
描述包括可用的副本数量、指定的标签以及与部署相关的事件。这些事件将突出显示可能发生的任何问题和错误。
$ kubectl describe deployment http
Name: http
Namespace: default
CreationTimestamp: Wed, 03 Feb 2021 14:03:28 +0000
Labels: run=http
Annotations: deployment.kubernetes.io/revision: 1
Selector: run=http
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: run=http
Containers:
http:
Image: katacoda/docker-http-server:latest
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: http-774bb756bb (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 88s deployment-controller Scaled up replica set http-774bb756bb to 1
创建了部署后,我们可以使用kubectl
创建一个服务,该服务在特定端口上公开pod
。通过kubectl Expose
公开新部署的http部署
。该命令允许您定义服务的不同参数以及如何公开部署
se使用以下命令暴露与该主机的外部ip绑定的主机8000上的集装箱端口80。
$ kubectl expose deployment http --external-ip="172.17.0.40" --port=8000 --target-port=80
service/http exposed
$ curl http://172.17.0.40:8000
<h1>This request was processed by host: http-774bb756bb-dnzk4</h1>
使用kubectl run
,可以创建部署并将其作为单个命令公开。
使用命令创建端口 8001
上公开的第二个http服务
。
kubectl run httpexposed——image=katacoda/ Docker -http-server:latest——replicas=1——port=80——hostport=8001
使用curl
访问http://172.17.0.40:8001
$ kubectl run httpexposed --image=katacoda/docker-http-server:latest --replicas=1 --port=80 --hostport=8001
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
Error from server (AlreadyExists): deployments.apps "httpexposed" already exists
$ curl http://172.17.0.40:8001
<h1>This request was processed by host: httpexposed-68cb8c8d4-zxcrk</h1>
在底层,这将通过Docker
端口映射-Docker Port Mapping
公开Pod
。因此,你是没法看到kubectl get svc
所列出的服务信息的,
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
http ClusterIP 10.96.48.39 172.17.0.40 8000/TCP 19m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 44m
要使用docker ps | grep httpexposed
才可以看到服务详细信息
$ docker ps | grep httpexposed
d7cc5f4a32c9 katacoda/docker-http-server "/app" 19 minutes ago Up 19 minutes k8s_httpexposed_httpexposed-68cb8c8d4-zxcrk_default_592a02cd-9cb3-4aa6-91c4-8f60aeeaec00_0
ab9cf46a2fd0 k8s.gcr.io/pause:3.1 "/pause" 19 minutes ago Up 19 minutes 0.0.0.0:8001->80/tcp k8s_POD_httpexposed-68cb8c8d4-zxcrk_default_592a02cd-9cb3-4aa6-91c4-8f60aeeaec00_0
运行上述命令,你会注意到Pod
上公开端口,而不是http容器
本身。Pause container
负责为Pod定义网络。pod
中的其他容器共享相同的网络名称空间。这提高了网络性能,并允许多个容器通过同一个网络接口进行通信。
随着部署的运行,我们现在可以使用kubectl
来扩展副本的数量。扩展部署将要求Kubernetes
启动更多的Pods
。然后,这些pod
将使用暴露的服务自动进行负载平衡。
kubectl scale
命令允许我们调整为特定部署或复制控制器运行的Pods
的数量。
kubectl scale --replicas=3 deployment http
列出所有的pod
,会看到三个正在为http
部署运行
$ kubectl scale --replicas=3 deployment http
deployment.apps/http scaled
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
http-774bb756bb-dnzk4 1/1 Running 0 32m
http-774bb756bb-gg9p8 1/1 Running 0 32s
http-774bb756bb-kmhpn 1/1 Running 0 32s
httpexposed-68cb8c8d4-zxcrk 1/1 Running 0 24m
一旦每个Pod启动,它将被添加到负载平衡器服务中。
kubectl describe svc http
通过描述服务,您可以查看端点和包含的相关pod
向服务发出请求将在不同节点中请求。
curl http://172.17.0.40:8000
$ kubectl describe svc http
Name: http
Namespace: default
Labels: run=http
Annotations: <none>
Selector: run=http
Type: ClusterIP
IP: 10.104.156.248
External IPs: 172.17.0.27
Port: <unset> 8000/TCP
TargetPort: 80/TCP
Endpoints: 172.18.0.4:80,172.18.0.6:80,172.18.0.7:80
Session Affinity: None
Events: <none>
$ curl http://172.17.0.27:8000
<h1>This request was processed by host: http-774bb756bb-jq4b8</h1>