关于SegmentFault:K8S太火了花10分钟玩转它不香么

9次阅读

共计 11459 个字符,预计需要花费 29 分钟才能阅读完成。

我的 Mall 电商实战我的项目始终应用的是 Docker 容器化部署,有很多敌人倡议搞个 Kubernetes 部署。最近正好在学习 Kubernetes,筹备更新一波!明天咱们先来学习下 Kubernetes 的外围概念和根本应用,心愿对大家有所帮忙!

SpringBoot 实战电商我的项目 mall(40k+star)地址:https://github.com/macrozheng/mall

Kubernetes 简介

Kubernetes(简称 K8S,K 和 S 之间有 8 个字母)是用于主动部署,扩大和治理容器化应用程序的开源零碎。它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。Kubernetes 源自 Google 15 年生产环境的运维教训,同时凝聚了社区的最佳创意和实际。

Kubernetes 具备如下个性:

  • 服务发现与负载平衡:无需批改你的应用程序即可应用生疏的服务发现机制。
  • 存储编排:主动挂载所选存储系统,包含本地存储。
  • Secret 和配置管理:部署更新 Secrets 和应用程序的配置时不用从新构建容器镜像,且不用将软件堆栈配置中的机密信息裸露进去。
  • 批量执行:除了服务之外,Kubernetes 还能够治理你的批处理和 CI 工作负载,在冀望时替换掉生效的容器。
  • 程度扩缩:应用一个简略的命令、一个 UI 或基于 CPU 应用状况主动对应用程序进行扩缩。
  • 自动化上线和回滚:Kubernetes 会分步骤地将针对利用或其配置的更改上线,同时监督应用程序运行状况以确保你不会同时终止所有实例。
  • 主动装箱:依据资源需要和其余束缚主动搁置容器,同时防止影响可用性。
  • 自我修复:重新启动失败的容器,在节点死亡时替换并从新调度容器,杀死不响应用户定义的健康检查的容器。

Minikube 简介

Minikube 是一种轻量级的 Kubernetes 实现,可在本地计算机上创立 VM 并部署仅蕴含一个节点的简略集群,Minikube 可用于 Linux、MacOS 和 Windows 零碎。Minikube CLI 提供了用于疏导集群工作的多种操作,包含启动、进行、查看状态和删除。

Kubernetes 外围概念

因为 Kubernetes 有很多外围概念,学习它们对了解 Kubernetes 的应用很有帮忙,所以咱们先来学习下这些外围概念。

Node

Kubernetes 集群是指 Kubernetes 协调一个高可用计算机集群,每个计算机作为独立单元相互连贯工作。

一个 Kubernetes 集群蕴含两种类型的资源:

  • Master:负责管理整个集群。协调集群中的所有流动,例如调度利用、保护利用的所需状态、利用扩容以及推出新的更新。
  • Node:用于托管正在运行的利用。能够是一个虚拟机或者物理机,它在 Kubernetes 集群中充当工作机器的角色,每个 Node 都有 Kubelet,它治理 Node 而且是 Node 与 Master 通信的代理,Node 还具备用于解决容器操作的工具,例如 Docker 或 rkt。

Deployment

Deployment 负责创立和更新应用程序的实例。创立 Deployment 后,Kubernetes Master 将应用程序实例调度到集群中的各个节点上。如果托管实例的节点敞开或被删除,Deployment 控制器会将该实例替换为群集中另一个节点上的实例。这提供了一种自我修复机制来解决机器故障保护问题。

能够应用 Kubernetes 命令行界面 Kubectl 创立和治理 Deployment。Kubectl 应用 Kubernetes API 与集群进行交互。

Pod

Pod 相当于 逻辑主机 的概念,负责托管利用实例。包含一个或多个应用程序容器(如 Docker),以及这些容器的一些共享资源(共享存储、网络、运行信息等)。

Service

Service 是一个形象层,它定义了一组 Pod 的逻辑集,并为这些 Pod 反对内部流量裸露、负载平衡和服务发现。

只管每个 Pod 都有一个惟一的 IP 地址,然而如果没有 Service,这些 IP 不会裸露在群集内部。Service 容许您的应用程序接管流量。Service 也能够用在 ServiceSpec 标记 type 的形式裸露,type 类型如下:

  • ClusterIP(默认):在集群的外部 IP 上公开 Service。这种类型使得 Service 只能从集群内拜访。
  • NodePort:应用 NAT 在集群中每个选定 Node 的雷同端口上公开 Service。应用 <NodeIP>:<NodePort> 从集群内部拜访 Service。是 ClusterIP 的超集。
  • LoadBalancer:在以后云中创立一个内部负载均衡器(如果反对的话),并为 Service 调配一个固定的内部 IP。是 NodePort 的超集。
  • ExternalName:通过返回带有该名称的 CNAME 记录,应用任意名称(由 spec 中的 externalName 指定)公开 Service。不应用代理。

Docker 装置

因为 Kubernetes 运行须要依赖 容器运行时(负责运行容器的软件),现比拟通用的容器运行时有 Docker、containerd 和 CRI-O。这里抉择 Docker,先在 Linux 服务器上安装好 Docker 环境。

  • 装置yum-utils
yum install -y yum-utils device-mapper-persistent-data lvm2
  • 为 yum 源增加 docker 仓库地位:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • 装置 Docker:
yum install docker-ce
  • 启动 Docker:
systemctl start docker

Minikube 装置

  • 首先咱们须要下载 Minikube 的二进制安装包并装置:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
  • 而后应用如下命令启动 Minikube:
minikube start
  • 如果你应用的是 root 用户的话会无奈启动并提醒如下信息,那是因为 Minikube 不容许应用 root 权限启动,须要创立一个非 root 账号再启动;
* minikube v1.16.0 on Centos 7.6.1810
* Automatically selected the docker driver
* The "docker" driver should not be used with root privileges.
* If you are running minikube within a VM, consider using --driver=none:
*   https://minikube.sigs.k8s.io/docs/reference/drivers/none/

X Exiting due to DRV_AS_ROOT: The "docker" driver should not be used with root privileges.
  • 这里创立了一个属于 docker 用户组的 macro 用户,并切换到该用户;
# 创立用户
useradd -u 1024 -g docker macro
# 设置用户明码
passwd macro
# 切换用户
su macro
  • 再次应用 minikube start 命令启动 Minikube,启动胜利后会显示如下信息:
* To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
* Preparing Kubernetes v1.20.0 on Docker 20.10.0 ...
  - Generating certificates and keys ...
  - Booting up control plane ...
  - Configuring RBAC rules ...
* Verifying Kubernetes components...
* Enabled addons: default-storageclass, storage-provisioner
* kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

Kubernetes 的应用

创立集群

通过 Minikube 咱们能够创立一个单节点的 K8S 集群,集群治理 Master 和负责运行利用的 Node 都部署在此节点上。

  • 查看 Minikube 的版本号:
minikube version
minikube version: v1.16.0
commit: 9f1e482427589ff8451c4723b6ba53bb9742fbb1
  • 查看 kubectl 的版本号,第一次应用会间接装置 kubectl:
minikube kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:59:43Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:51:19Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
  • 如果你想间接应用 kubectl 命令的话,能够将其复制到 /bin 目录上来:
# 查找 kubectl 命令的地位
find / -name kubectl
# 找到之后复制到 /bin 目录下
cp /mydata/docker/volumes/minikube/_data/lib/minikube/binaries/v1.20.0/kubectl /bin/
# 间接应用 kubectl 命令
kubectl version
  • 查看集群详细信息:
kubectl cluster-info
Kubernetes control plane is running at https://192.168.49.2:8443
KubeDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
  • 查看集群中的所有 Node,能够发现 Minikube 创立了一个单节点的简略集群:
kubectl get nodes
NAME       STATUS   ROLES                  AGE   VERSION
minikube   Ready    control-plane,master   46m   v1.20.0

部署利用

一旦运行了 K8S 集群,就能够在其上部署容器化应用程序。通过创立 Deployment 对象,能够指挥 K8S 如何创立和更新应用程序的实例。

  • 指定好利用镜像并创立一个 Deployment,这里创立一个 Nginx 利用:
kubectl create deployment kubernetes-nginx --image=nginx:1.10
  • 创立一个 Deployment 时 K8S 会产生如下操作:

    • 抉择一个适合的 Node 来部署这个利用;
    • 将该利用部署到 Node 上;
    • 当利用异样敞开或删除时重新部署利用。
  • 查看所有 Deployment:
kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-nginx      1/1     1            1           21h
  • 咱们能够通过 kubectl proxy 命令创立一个代理,这样就能够通过裸露进去的接口间接拜访 K8S 的 API 了,这里调用了查问 K8S 版本的接口;
[macro@linux-local root]$ kubectl proxy
Starting to serve on 127.0.0.1:8001
[root@linux-local ~]# curl http://localhost:8001/version
{
  "major": "1",
  "minor": "20",
  "gitVersion": "v1.20.0",
  "gitCommit": "af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38",
  "gitTreeState": "clean",
  "buildDate": "2020-12-08T17:51:19Z",
  "goVersion": "go1.15.5",
  "compiler": "gc",
  "platform": "linux/amd64"
}

查看利用

通过对运行利用的 Pod 进行操作,能够查看容器日志,也能够执行容器外部命令。

  • 查看 K8s 中所有 Pod 的状态:
kubectl get pods
NAME                                   READY   STATUS             RESTARTS   AGE
kubernetes-nginx-78bcc44665-8fnnn      1/1     Running            1          21h
  • 查看 Pod 的具体状态,包含 IP 地址、占用端口、应用镜像等信息;
kubectl describe pods
Name:         kubernetes-nginx-78bcc44665-8fnnn
Namespace:    default
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Tue, 05 Jan 2021 13:57:46 +0800
Labels:       app=kubernetes-nginx
              pod-template-hash=78bcc44665
              version=v1
Annotations:  <none>
Status:       Running
IP:           172.17.0.7
IPs:
  IP:           172.17.0.7
Controlled By:  ReplicaSet/kubernetes-nginx-78bcc44665
Containers:
  nginx:
    Container ID:   docker://31eb1277e507ec4cf8a27b66a9f4f30fb919d17f4cd914c09eb4cfe8322504b2
    Image:          nginx:1.10
    Image ID:       docker-pullable://nginx@sha256:6202beb06ea61f44179e02ca965e8e13b961d12640101fca213efbfd145d7575
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Wed, 06 Jan 2021 09:22:40 +0800
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Tue, 05 Jan 2021 14:24:55 +0800
      Finished:     Tue, 05 Jan 2021 17:32:48 +0800
    Ready:          True
    Restart Count:  1
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-dhr4b (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-dhr4b:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-dhr4b
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:          <none>
  • 将 Pod 的名称设置为环境变量,不便之后应用 $POD_NAME 来利用 Pod 的名称:
export POD_NAME=kubernetes-nginx-78bcc44665-8fnnn
  • 查看 Pod 打印的日志:
kubectl logs $POD_NAME
  • 应用 exec 能够在 Pod 的容器中执行命令,这里应用 env 命令查看环境变量:
kubectl exec $POD_NAME -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=kubernetes-nginx-78bcc44665-8fnnn
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
NGINX_VERSION=1.10.3-1~jessie
HOME=/root
  • 进入容器外部并执行 bash 命令,如果想退出容器能够应用 exit 命令:
kubectl exec -ti $POD_NAME -- bash

公开裸露利用

默认 Pod 无奈被集群内部拜访,须要创立 Service 并裸露端口能力被内部拜访。

  • 创立一个 Service 来裸露 kubernetes-nginx 这个 Deployment:
kubectl expose deployment/kubernetes-nginx --type="NodePort" --port 80
  • 查看 K8S 中所有 Service 的状态:
kubectl get services
NAME               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes         ClusterIP   10.96.0.1        <none>        443/TCP        5h16m
kubernetes-nginx   NodePort    10.105.177.114   <none>        80:31891/TCP   5s
  • 查看 Service 的详情,通过 NodePort 属性能够失去裸露到内部的端口;
kubectl describe services/kubernetes-nginx
Name:                     kubernetes-nginx
Namespace:                default
Labels:                   app=kubernetes-nginx
Annotations:              <none>
Selector:                 app=kubernetes-nginx
Type:                     NodePort
IP Families:              <none>
IP:                       10.106.227.54
IPs:                      10.106.227.54
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30158/TCP
Endpoints:                172.17.0.7:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
  • 通过 CURL 命令通过 Minikube IP:NodePort IP 能够拜访 Nginx 服务,此时将打印 Nginx 主页信息;
curl $(minikube ip):30158
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

标签的应用

通过给资源增加 Label,能够不便地治理资源(如 Deployment、Pod、Service 等)。

  • 查看 Deployment 中所蕴含的 Label;
kubectl describe deployment
Name:                   kubernetes-nginx
Namespace:              default
CreationTimestamp:      Tue, 05 Jan 2021 13:57:46 +0800
Labels:                 app=kubernetes-nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=kubernetes-nginx
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
  • 通过 Label 查问 Pod:
kubectl get pods -l app=kubernetes-nginx
NAME                                READY   STATUS    RESTARTS   AGE
kubernetes-nginx-78bcc44665-8fnnn   1/1     Running   1          21h
  • 通过 Label 查问 Service:
kubectl get services -l app=kubernetes-nginx
NAME               TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes-nginx   NodePort   10.106.227.54   <none>        80:30158/TCP   4m44s
  • 给 Pod 增加 Label:
kubectl label pod $POD_NAME version=v1
  • 查看 Pod 的详细信息,能够查看 Label 信息:
kubectl describe pods $POD_NAME
Name:         kubernetes-nginx-78bcc44665-8fnnn
Namespace:    default
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Tue, 05 Jan 2021 13:57:46 +0800
Labels:       app=kubernetes-nginx
              pod-template-hash=78bcc44665
              version=v1
  • 通过 Label 查问 Pod:
kubectl get pods -l version=v1
  • 通过 Label 删除服务:
kubectl delete service -l app=kubernetes-nginx
NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes         ClusterIP   10.96.0.1       <none>        443/TCP        30h

可视化治理

Dashboard 是基于网页的 K8S 用户界面。你能够应用 Dashboard 将容器利用部署到 K8S 集群中,也能够对容器利用排错,还能治理集群资源。

  • 查看 Minikube 内置插件,默认状况下 Dashboard 插件未启用:
minikube addons list
|-----------------------------|----------|--------------|
|         ADDON NAME          | PROFILE  |    STATUS    |
|-----------------------------|----------|--------------|
| dashboard                   | minikube | disabled     |
| default-storageclass        | minikube | enabled ✅   |
|-----------------------------|----------|--------------|
  • 启用 Dashboard 插件:
minikube addons enable dashboard
  • 开启 Dashboard,通过 --url 参数不会关上治理页面,并能够在控制台取得拜访门路:
minikube dashboard --url
* Verifying dashboard health ...
* Launching proxy ...
* Verifying proxy health ...
http://127.0.0.1:44469/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
  • 要想从内部拜访 Dashboard,须要从应用 kubectl 设置代理才行,--address设置为你的服务器地址;
kubectl proxy --port=44469 --address='192.168.5.94' --accept-hosts='^.*' &
  • 从内部拜访服务器须要开启防火墙端口;
# 切换到 root 用户
su -
# 开启端口
firewall-cmd --zone=public --add-port=44469/tcp --permanent
# 重启防火墙
firewall-cmd --reload
  • 通过如下地址即可拜访 Dashboard:
http://192.168.5.94:44469/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
  • 查看 K8S 集群中的资源状态信息:

  • 通过 yaml 脚本创立 K8S 资源:

  • 查看 K8S 中所有 Pod 的状态信息,通过更多按钮能够查看容器日志和执行外部命令。

总结

当咱们的利用须要部署在多个物理机上时,传统的做法是一个个物理机器去部署。如果咱们应用了 K8S 的话,就能够把这些物理机认为是一个集群,只需通过 K8S 把利用部署到集群即可,无需关怀物理机的部署细节。同时 K8S 提供了程度扩容、主动装箱、主动修复等性能,大大减少了利用集群化部署的工作量。

参考资料

官网文档:https://kubernetes.io/zh/docs…

本文 GitHub https://github.com/macrozheng/mall-learning 曾经收录,欢送大家 Star!

正文完
 0