返回
Featured image of post Kubernetes初探(三)

Kubernetes初探(三)

使用 Kubectl 启动容器

Katacoda在线课:Deploy Containers Using Kubectl

本系列教程希望能通过交互式学习网站与传统方式结合,更高效、容易的学习知识。 本系列教程将使用 Katacoda在线学习平台 完成学习。

在此场景中,将学习如何使用 Kubectl 创建和启动 Deployment 和 Replication Controllers 并通过 Services 对外暴露接口。本场景中无需编写 yaml 定义,便可以快速将容器启动到集群上。

启动集群

首先,我们需要启动一个 Kubernetes 集群。

执行以下命令启动集群并下载 Kubectl CLI。

$ 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   Ready    master   19s   v1.17.3

Kubectl Run

Run 命令根据指定的参数(例如映像或副本)创建部署。该部署发布给 Kubernetes 主节点,启动所需 Pod 和容器的 。 Kubectl run 类似于 docker run,但 Kubectl run 是在集群中运行的。

命令的格式为 kubectl run <name of deployment> <properties>

任务

以下命令将启动一个名为 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 查看各部署的状态。

$ kubectl get deployments
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
http   1/1     1            1           2m7s

可以通过 describe 查看 Kubernetes 创建了哪些内容。

$ kubectl describe deployment http
Name:                   http
Namespace:              default
CreationTimestamp:      Wed, 21 Jul 2021 08:04:55 +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  4m16s  deployment-controller  Scaled up replica set http-774bb756bb to 1

描述中包含有多少副本可用、指定的标签以及与部署相关的事件等信息。这些事件将突出显示可能发生的任何问题和错误。

在下一步中,我们将开放正在运行的服务。

Kubectl Expose

创建部署后,我们可以使用 kubectl 创建一个服务,该服务在特定端口上开放 Pod。

通过 kubectl expose 开放新部署的 http 部署。该命令允许定义服务的不同参数以及如何开放该部署。

任务

使用以下命令将主机上的容器端口 80 公开 8000 绑定到主机的 external-ip。

$ kubectl expose deployment http --external-ip="172.17.0.44" --port=8000 --target-port=80
service/http exposed

接下来就能 ping 主机查看 HTTP 服务返回的结果。

$ curl http://172.17.0.44:8000
<h1>This request was processed by host: http-774bb756bb-m6tjp</h1>

Kubectl Run and Expose

可以单独使用命令 kubectl run 来创建部署并将其开放。

任务

使用命令创建在端口 8001 上开放的第二个 http 服务。

$ 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.
deployment.apps/httpexposed created

接下来可以使用 curl http://172.17.0.41:8001 来访问该服务。

$ curl http://172.17.0.44:8001
<h1>This request was processed by host: httpexposed-68cb8c8d4-r7qtt</h1>

在服务内,通过 Docker 端口映射开放了 Pod。因此,您将看不到使用 kubectl get svc 列出的服务

$ kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
http         ClusterIP   10.97.103.237   172.17.0.44   8000/TCP   4m47s
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    44m

可以通过 docker ps | grep httpexposed 命令查看详细信息。

$ docker ps | grep httpexposed
1690c6682f93        katacoda/docker-http-server   "/app"                   2 minutes ago       Up 2 minutes                               k8s_httpexposed_httpexposed-68cb8c8d4-r7qtt_default_6fb23c14-277e-4298-b325-c52ef4eb09a9_0
d9ae0076a0d4        k8s.gcr.io/pause:3.1          "/pause"                 2 minutes ago       Up 2 minutes        0.0.0.0:8001->80/tcp   k8s_POD_httpexposed-68cb8c8d4-r7qtt_default_6fb23c14-277e-4298-b325-c52ef4eb09a9_0

暂停容器

运行上面的命令,你会注意到端口暴露在 Pod 上,而不是 http 容器本身。 Pause 容器负责为 Pod 定义网络。 Pod 中的其他容器共享相同的网络命名空间。允许多个容器通过同一网络接口进行通信,提高了网络性能。

容器扩展

随着我们的部署运行,我们现在可以使用 kubectl 来扩展副本的数量。

扩展部署将请求 Kubernetes 启动额外的 Pod。然后,这些 Pod 将使用开放服务自动进行负载平衡。

任务

kubectl scale 命令能够为特定 Deployment 或 Replication Controller 调整运行的 Pod 数量。

$ kubectl scale --replicas=3 deployment http
deployment.apps/http scaled

列出所有 pod,能够看到三个正在运行的 http 部署。

$ kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
http-774bb756bb-m6tjp         1/1     Running   0          20m
http-774bb756bb-q29v8         1/1     Running   0          45s
http-774bb756bb-x2xxv         1/1     Running   0          45s
httpexposed-68cb8c8d4-r7qtt   1/1     Running   0          9m3s

一旦每个 Pod 启动,就会被添加到负载均衡器服务中。通过 describe,可以查看包含的端点和与之关联的 Pod。

$ kubectl describe svc http
Name:              http
Namespace:         default
Labels:            run=http
Annotations:       <none>
Selector:          run=http
Type:              ClusterIP
IP:                10.97.103.237
External IPs:      172.17.0.44
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.44:8000
<h1>This request was processed by host: http-774bb756bb-x2xxv</h1>
$ curl http://172.17.0.44:8000
<h1>This request was processed by host: http-774bb756bb-q29v8</h1>
$ curl http://172.17.0.44:8000
<h1>This request was processed by host: http-774bb756bb-q29v8</h1>
$ curl http://172.17.0.44:8000
<h1>This request was processed by host: http-774bb756bb-x2xxv</h1>
$ curl http://172.17.0.44:8000
<h1>This request was processed by host: http-774bb756bb-q29v8</h1>
$ curl http://172.17.0.44:8000
<h1>This request was processed by host: http-774bb756bb-q29v8</h1>
$ curl http://172.17.0.44:8000
<h1>This request was processed by host: http-774bb756bb-m6tjp</h1>
$ curl http://172.17.0.44:8000
<h1>This request was processed by host: http-774bb756bb-x2xxv</h1>
Licensed under CC BY-NC-SA 4.0
最后更新于 Jul 21, 2021 16:29 +0800
Built with Hugo
Theme Stack designed by Jimmy