如何使用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.3run命令根据指定的参数(如映像或副本)创建部署。这个部署被分发给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 20skubectl 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>