69、使用 Kubernetes 将应用部署为容器

使用 Kubernetes 将应用部署为容器

1. 理解 Kubernetes

Linux 容器将其所包含的应用与运行它们的操作系统隔离开来。一个构建良好的容器可以容纳一个离散的软件栈,这个软件栈可以高效地共享、迁移并在任何地方运行。但故事不止于此,当你拥有了一些 Docker 容器后,下一步就是通过像 Kubernetes 这样的平台来管理它们,Kubernetes 可以实现以下功能:
- 分组容器 :将一组容器组合在一起形成一个更大的应用。例如,一起部署一个 Web 服务器、一个数据库和监控工具。
- 按需扩展 :根据需求扩展容器。你可以单独扩展大型应用的每个组件,而不必扩展那些需求不需要扩展的单个应用。
- 设置应用状态 :不仅仅是运行容器,还可以设置应用的状态。例如,决定“运行容器 X 的三个副本,如果其中一个停止运行,确保启动另一个来替换它”。
- 故障恢复 :从主机计算机的故障或过载中恢复。如果运行容器的主机崩溃,容器能够快速恢复并在另一台主机计算机上启动。
- 基础设施无关性 :应用可以连接到它所需的服务,而无需知道与这些服务关联的主机名、IP 地址或端口号。
- 无停机升级 :升级容器化应用而无需停机。

Kubernetes 提供了所有这些功能以及更多。虽然最初有其他平台(如 Mesos 和 Docker Swarm)竞争成为容器编排的首选平台,但现在 Kubernetes 是编排、部署和管理容器化应用的无可争议的领导者。

2. Kubernetes 集群组件

Kubernetes 集群由主节点和工作节点组成。对于个人使用,你可以在同一系统上运行所有主节点和工作节点服务。例如,使用 MicroK8s,你可以从笔记本电脑上的虚拟机运行 Kubernetes 集群(www.ubuntu.com/kubernetes/install)。在生产环境中,你需要将 Kubernetes 分布在多个物理或虚拟系统上。以下是设置生产级 Kubernetes 基础设施时需要考虑的不同组件:
| 组件 | 描述 |
| ---- | ---- |
| 主节点(Masters) | 管理 Kubernetes 集群中运行的组件。管理组件之间的通信,调度应用在工作节点上运行,根据需要扩展应用,并确保运行适当数量的容器(分布在 Pod 中)。至少需要一个主节点,通常会有三个或更多,以确保始终至少有一个可用的主节点。 |
| 工作节点(Workers) | 部署的容器实际运行的地方。所需的工作节点数量取决于工作负载。在生产环境中,肯定需要多个工作节点,以防其中一个出现故障或需要维护。 |
| 存储(Storage) | 网络存储允许容器访问相同的存储,而不管运行它们的节点是什么。 |
| 其他服务(Other services) | 为了将 Kubernetes 环境集成到现有的数据中心,你可能需要利用现有的服务。例如,使用公司的域名系统(DNS)服务器进行主机名到地址的解析,使用轻量级目录访问协议(LDAP)或 Active Directory 服务进行用户身份验证,以及使用网络时间协议(NTP)服务器进行时间同步。 |

在 Kubernetes 中,部署容器的最小单位称为 Pod。一个 Pod 可以容纳一个或多个容器,以及描述其容器的元数据。虽然一个 Pod 通常只包含一个容器,但有时一个 Pod 包含多个容器也是合适的。例如,一个 Pod 可能包含一个边车容器,用于监控 Pod 中主容器中运行的服务。

3. Kubernetes 主节点和工作节点的工作机制
  • 主节点(Kubernetes masters) :主节点指导 Kubernetes 集群的活动。主节点通过一组服务监督集群的所有活动。Kubernetes 主节点的核心是应用程序编程接口(API)服务器(kube - apiserver),它接收对象请求。集群中所有节点之间的通信都通过 API 服务器进行。当主节点收到一个对象请求(如要求运行一定数量的 Pod)时,Kubernetes 调度器(kube - scheduler)会找到可用的节点来运行每个 Pod,并安排它们在这些节点上运行。为了确保每个对象保持在规定的状态,Kubernetes 控制器(kube - controller - manager)会持续运行,以确保命名空间存在、定义的服务账户可用、运行正确数量的副本以及定义的端点处于活动状态。
  • 工作节点(Kubernetes workers) :每个 Kubernetes 工作节点的核心是 kubelet 服务。kubelet 向 API 服务器注册其工作节点。然后,API 服务器指示 kubelet 执行诸如运行通过 PodSpec 从 API 服务器请求的容器,并确保容器继续以健康状态运行等操作。每个节点上还运行着一个容器引擎(通常称为运行时)。最初,docker 服务是用于根据 PodSpec 启动、管理和删除容器的最流行的容器引擎。然而,现在也有其他容器引擎可用,例如 CRI - O 容器引擎(www.cri - o.io),它与一些商业 Kubernetes 平台(如 OpenShift)一起使用。工作节点应尽可能通用,以便在需要额外容量时可以简单地启动一个新节点,并且它将被配置为处理大多数运行容器的请求。但是,也存在容器可能不适合在特定节点上运行的情况。例如,一个 Pod 可能请求在具有最小内存和 CPU 可用量的节点上运行,或者它可能请求在运行相关容器的节点上运行。同样,如果一个 Pod 需要特殊的运行条件(如特定的计算机架构、硬件或操作系统),也有方法可以将 Pod 调度到满足这些需求的工作节点上。
4. Kubernetes 应用管理

在 Kubernetes 中,应用通过定义 API 对象来管理,这些对象设置集群上资源的状态。例如,你可以在 YAML 文件中创建一个 Deployment 对象,该对象定义每个运行一个或多个容器的 Pod,以及它运行的命名空间和每个 Pod 运行的副本数量。该对象还可以定义每个容器打开的端口和挂载的任何卷。Kubernetes 主节点会响应这些请求,并确保请求在 Kubernetes 工作节点上得到执行。

Kubernetes 使用服务的概念将应用的位置与其实际的互联网协议(IP)地址和端口号分开。通过为提供该服务的一组 Pod 分配一个服务名称,集群外部不需要知道每个 Pod 的确切位置。相反,由 Kubernetes 将对该服务的请求定向到可用的 Pod。

默认情况下,与活动 Pod 关联的 IP 地址不能从集群外部直接访问。你需要定义如何将与一组 Pod 关联的服务暴露到集群外部。使用 Service 对象,你可以通过不同的方式暴露服务:
- ClusterIP :默认情况下,通过 ClusterIP 服务类型暴露的服务仅对集群内的其他组件可用。
- NodePort :将提供服务的 Pod 通过每个运行该 Pod 的节点上的外部 IP 地址上的相同 Kubernetes 分配的端口进行访问。
- LoadBalancer :分配一个外部的固定 IP 地址,并为提供服务的 Pod 执行负载均衡。云的外部负载均衡器将流量定向到后端 Pod。
- ExternalName :将服务与特定的 DNS CNAME 记录关联。

无论你如何暴露 Kubernetes 服务,当有对该服务的请求时,Kubernetes 都会将通信路由到提供该服务的一组 Pod。这样,Pod 可以启动和停止,而不会影响使用该服务的客户端。

5. Kubernetes 接口

Kubernetes 有命令行和 Web 控制台两种接口来访问 Kubernetes 集群。本文的示例主要关注命令行工具,其中包括 kubectl,它是管理 Kubernetes 集群的通用工具。

6. 尝试 Kubernetes

设置自己的生产级 Kubernetes 集群需要一些预先考虑,本文将重点介绍几种快速启动和访问个人 Kubernetes 集群的简单方法。以下是三种不同的访问 Kubernetes 集群的方式:
- Kubernetes 教程 :官方 Kubernetes 网站提供交互式的 Web 用户界面(UI)教程,你可以在其中启动自己的集群并试用 Kubernetes。从 Kubernetes 教程(www.kubernetes.io/docs/tutorials/)中,你可以选择基础、配置和无状态应用等其他教程主题。
- MicroK8s :使用 MicroK8s,你可以在本地运行 Kubernetes,并在几分钟内在笔记本电脑或桌面系统上运行 Kubernetes 集群。
- Docker Desktop :另一个选项(本文未详细介绍)是 Docker Desktop,它允许你启用一个预配置的 Kubernetes 集群,该集群在你的工作站上运行主节点和工作节点。

7. 启动并运行 Kubernetes

以下是在 Ubuntu 服务器上安装和启动 MicroK8s 的步骤:
1. 安装 MicroK8s

# snap install microk8s --classic
[sudo] password for ubuntu: 
microk8s v1.18.2 from Canonical✓ installed
  1. 查看集群信息 :MicroK8s 环境要求在 kubectl 命令前加上 microk8s 前缀。
# microk8s.kubectl cluster-info
Kubernetes master is running at https://127.0.0.1:16443
To further debug and diagnose cluster problems, use 'kubectl cluster-
info dump'.
  1. 创建别名 :为了避免每次都输入前缀,可以创建一个别名。
# snap alias microk8s.kubectl kubectl
[sudo] password for ubuntu: 
Added:
  - microk8s.kubectl as kubectl
  1. 避免使用 sudo :编辑 /etc/group 文件中的 microk8s 行,将你的用户名添加进去。注销并重新登录账户后,就不需要显式的管理员权限了。
# nano /etc/group
microk8s:x:998:ubuntu
  1. 测试 kubectl 命令 :直接运行 kubectl 命令,它会输出一个有用的命令行界面(CLI)介绍。
$ kubectl
kubectl controls the Kubernetes cluster manager.
 Find more information at:
https://kubernetes.io/docs/reference/kubectl/overview/

Basic Commands (Beginner):
  create        Create a resource from a file or from stdin.
  expose        Take a replication controller, service, deployment 
or pod and
  expose it as a new Kubernetes Service
  run           Run a particular image on the cluster
  set           Set specific features on objects

Basic Commands (Intermediate):
  explain       Documentation of resources
  get           Display one or many resources
  edit          Edit a resource on the server
  delete        Delete resources by filenames, stdin, resources and 
names, or by
resources and label selector
  1. 获取当前节点信息
$ kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
ubuntu   Ready    <none>   37m   v1.18.2-41+b5cdb79a4060a3s
8. 部署 Kubernetes 应用

在 Kubernetes 集群上运行和管理容器化应用(以 Pod 的形式)的请求称为部署。一旦创建了部署,Kubernetes 集群将确保请求的 Pod 始终运行。它通过以下方式实现:
- 通过 API 服务器接受部署创建请求。
- 要求调度器在可用的工作节点上运行每个 Pod 中请求的容器。
- 监视 Pod,确保它们按请求继续运行。
- 如果 Pod 失败(例如,容器停止运行),在相同或不同的节点上启动一个新的 Pod 实例。

以下是部署一个 Kubernetes 应用的示例,我们将使用 kubernetes - bootcamp 容器,它是 Google 快速入门教程的一部分(kubernetesbootcamp.github.io/kubernetes - bootcamp):

$ kubectl create deployment kubernetes-bootcamp \
      --image=gcr.io/google-samples/kubernetes-bootcamp:v1
deployment.apps/kubernetes-bootcamp created

你可以使用以下命令列出部署:

$ kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   0/1     1            0           13s

使用以下命令查看部署的详细描述:

$ kubectl describe deployments kubernetes-bootcamp 
Name:                   kubernetes-bootcamp
Namespace:              default
CreationTimestamp:      Wed, 06 May 2020 01:28:55 +0000
Labels:                 app=kubernetes-bootcamp
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=kubernetes-bootcamp
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=kubernetes-bootcamp
  Containers:
   kubernetes-bootcamp:
    Image:        gcr.io/google-samples/kubernetes-bootcamp:v1
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   kubernetes-bootcamp-6f6656d949 (1/1 
replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  3m28s  deployment-controller  Scaled up 
replica set kubernetes-bootcamp-6f6656d949 to 1
9. 获取部署的 Pod 信息

创建部署后,你可以请求有关从该部署创建的 Pod 的信息,并通过代理服务将 Kubernetes API 从虚拟机暴露到本地系统,以便直接连接到 Pod。
1. 打开代理

$ kubectl proxy
Starting to serve on 127.0.0.1:8001
  1. 查询 Kubernetes API :打开第二个终端,使用 CURL 查询 Kubernetes API。
$ curl http://localhost:8001/version
{
  "major": "1",
  "minor": "18+",
  "gitVersion": "v1.18.2-41+b5cdb79a4060a3",
  "gitCommit": "b5cdb79a4060a307d0c8a56a128aadc0da31c5a2",
  "gitTreeState": "clean",
  "buildDate": "2020-04-27T17:31:24Z",
  "goVersion": "go1.14.2",
  "compiler": "gc",
  "platform": "linux/amd64"
}
  1. 获取 Pod 信息
$ kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-6f6656d949-nxgvd   1/1     Running   1          11h
$ kubectl describe pod kubernetes-bootcamp-6f6656d949-nxgvd 
Name:         kubernetes-bootcamp-6f6656d949-nxgvd
Namespace:    default
Priority:     0
Node:         ubuntu/192.168.1.18
Start Time:   Wed, 06 May 2020 01:28:55 +0000
Labels:       app=kubernetes-bootcamp
              pod-template-hash=6f6656d949
Annotations:  <none>
Status:       Running
IP:           10.1.46.3
IPs:
  IP:           10.1.46.3
Controlled By:  ReplicaSet/kubernetes-bootcamp-6f6656d949
Containers:
  kubernetes-bootcamp:
    Container ID:   containerd://
ff8aa8108b5a8cc7f82c0ef61d8729a9c7e64f30bdce55266aa30d0e20aea71a
    Image:          gcr.io/google-samples/kubernetes-bootcamp:v1
    Image ID:       gcr.io/google-samples/kubernetes-bootcamp@sha256:
0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Wed, 06 May 2020 13:04:02 +0000
    Last State:     Terminated
      Reason:       Unknown
      Exit Code:    255
      Started:      Wed, 06 May 2020 01:29:33 +0000
      Finished:     Wed, 06 May 2020 13:03:34 +0000
    Ready:          True
    Restart Count:  1
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-
token-jjhkp (ro)
  1. 使用变量获取 Pod 详细信息
$ export POD_NAME=$(kubectl get pods -o go-template --template \
 '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}') ; \
echo Name of the Pod: $POD_NAME
Name of the Pod: kubernetes-bootcamp-6f6656d949-nxgvd
$ curl \
 http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME
{
  "kind": "Pod",
  "apiVersion": "v1",
  "metadata": {
    "name": "kubernetes-bootcamp-6f6656d949-nxgvd",
    "generateName": "kubernetes-bootcamp-6f6656d949-",
    "namespace": "default",
    "selfLink": "/api/v1/namespaces/default/pods/kubernetes-bootcamp-
6f6656d949-nxgvd",
    "uid": "02cb61ca-003d-4a62-969d-e6858f1cde26",
    "resourceVersion": "28300",
    "creationTimestamp": "2020-05-06T01:28:55Z",
    "labels": {
      "app": "kubernetes-bootcamp",
      "pod-template-hash": "6f6656d949"
    },
    "ownerReferences": [
      {
        "apiVersion": "apps/v1",
        "kind": "ReplicaSet",
        "name": "kubernetes-bootcamp-6f6656d949",
        "uid": "86b0f4cd-d19e-458c-aa3d-17c09ac27729",
        "controller": true,
        "blockOwnerDeletion": true
      }
    ],
}
  1. 查看容器日志
$ kubectl logs $POD_NAME
Kubernetes Bootcamp App Started At: 2020-05-06T13:04:02.782Z | 
Running On:  kubernetes-bootcamp-6f6656d949-nxgvd 
  1. 在 Pod 内运行命令
$ kubectl exec $POD_NAME env
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a 
future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=kubernetes-bootcamp-6f6656d949-nxgvd
NPM_CONFIG_LOGLEVEL=info
NODE_VERSION=6.3.1
KUBERNETES_PORT_443_TCP=tcp://10.152.183.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.152.183.1
KUBERNETES_SERVICE_HOST=10.152.183.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.152.183.1:443
HOME=/root
$ kubectl exec -ti $POD_NAME bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a 
future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
root@kubernetes-bootcamp-6f6656d949-nxgvd:/# date
Wed May  6 13:33:51 UTC 2020
root@kubernetes-bootcamp-6f6656d949-nxgvd:/# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 13:04 ?        00:00:00 /bin/sh -c 
node server.js
root           6       1  0 13:04 ?        00:00:00 node server.js
root          17       0  0 13:33 pts/0    00:00:00 bash
root          23      17  0 13:33 pts/0    00:00:00 ps -ef
root@kubernetes-bootcamp-6f6656d949-nxgvd:/# curl localhost:8080

通过以上步骤,你可以了解如何使用 Kubernetes 部署和管理容器化应用。希望这些内容能帮助你更好地掌握 Kubernetes 的使用。

使用 Kubernetes 将应用部署为容器

10. 深入理解部署策略

在 Kubernetes 中,部署策略对于确保应用的高可用性和稳定性至关重要。前面提到的 RollingUpdate 是一种常见的部署策略,下面详细解释其工作原理。

RollingUpdate 策略允许在更新应用时逐步替换旧的 Pod 实例,而不是一次性全部替换。这样可以确保在更新过程中应用始终保持可用。其配置参数 25% max unavailable 25% max surge 分别表示:
- 25% max unavailable :在更新过程中,允许不可用的 Pod 实例数量最多为总实例数的 25%。
- 25% max surge :在更新过程中,允许额外创建的 Pod 实例数量最多为总实例数的 25%。

例如,如果你有 10 个 Pod 实例,那么在更新过程中,最多允许 2 个 Pod 不可用(向下取整),同时最多可以额外创建 2 个新的 Pod 实例。

除了 RollingUpdate ,Kubernetes 还支持其他部署策略,如 Recreate Recreate 策略会先删除所有旧的 Pod 实例,然后再创建新的 Pod 实例。这种策略适用于那些不支持滚动更新的应用,或者在更新过程中需要完全停止服务的情况。

11. 服务发现与负载均衡

Kubernetes 的服务发现机制使得应用可以方便地找到并连接到所需的服务。通过创建 Service 对象,你可以将一组 Pod 抽象为一个单一的服务,其他应用可以通过服务名称来访问这些 Pod。

下面是一个简单的服务发现和负载均衡的示例:

# 创建一个服务
$ kubectl expose deployment kubernetes-bootcamp --type=LoadBalancer --name=kubernetes-bootcamp-service
service/kubernetes-bootcamp-service exposed

# 获取服务信息
$ kubectl get services kubernetes-bootcamp-service
NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes-bootcamp-service LoadBalancer   10.100.100.100   <pending>     80:30000/TCP   1m

在这个示例中,我们创建了一个 LoadBalancer 类型的服务,将 kubernetes-bootcamp 部署暴露出去。 EXTERNAL-IP 字段显示为 <pending> ,表示云提供商正在为该服务分配外部 IP 地址。一旦分配完成,你就可以通过该外部 IP 地址和端口号访问应用。

Kubernetes 的负载均衡器会自动将流量分发到后端的 Pod 实例上,确保应用的高可用性和性能。

12. 持久化存储

在 Kubernetes 中,容器是短暂的,当 Pod 被删除或重新调度时,容器内的数据也会丢失。为了实现数据的持久化,Kubernetes 提供了持久化存储的机制。

以下是使用持久化存储的基本步骤:
1. 创建持久卷声明(PersistentVolumeClaim,PVC) :PVC 是用户对存储的请求,它定义了所需的存储大小、访问模式等。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
# 创建 PVC
$ kubectl apply -f my-pvc.yaml
persistentvolumeclaim/my-pvc created
  1. 在 Pod 中使用 PVC :在 Pod 的配置文件中,引用创建的 PVC。
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: nginx
      volumeMounts:
        - name: my-volume
          mountPath: /data
  volumes:
    - name: my-volume
      persistentVolumeClaim:
        claimName: my-pvc
# 创建 Pod
$ kubectl apply -f my-pod.yaml
pod/my-pod created

通过以上步骤,你可以确保 Pod 中的数据在容器重启或 Pod 重新调度时不会丢失。

13. 自动伸缩

Kubernetes 支持自动伸缩功能,根据应用的负载情况自动调整 Pod 的数量。水平 Pod 自动伸缩器(Horizontal Pod Autoscaler,HPA)是实现自动伸缩的主要工具。

以下是创建 HPA 的步骤:
1. 安装 Metrics Server :HPA 需要从 Metrics Server 获取 Pod 的资源使用情况。

# 安装 Metrics Server
$ kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
  1. 创建 HPA :根据 CPU 使用率自动调整 Pod 的数量。
$ kubectl autoscale deployment kubernetes-bootcamp --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/kubernetes-bootcamp autoscaled

在这个示例中,我们创建了一个 HPA,当 CPU 使用率超过 50% 时,自动增加 Pod 的数量,最多增加到 10 个;当 CPU 使用率低于 50% 时,自动减少 Pod 的数量,最少保留 1 个。

14. 安全与权限管理

Kubernetes 提供了丰富的安全和权限管理机制,确保集群的安全性。以下是一些常见的安全和权限管理措施:
- 命名空间(Namespace) :命名空间可以将集群划分为多个虚拟的隔离环境,不同的命名空间可以有不同的权限和资源配额。

# 创建一个新的命名空间
$ kubectl create namespace my-namespace
namespace/my-namespace created

# 在新的命名空间中创建资源
$ kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 -n my-namespace
deployment.apps/kubernetes-bootcamp created
  • 角色和角色绑定(Role and RoleBinding) :角色定义了一组权限,角色绑定将角色分配给特定的用户或服务账户。
# 创建一个角色
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: my-namespace
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

# 创建一个角色绑定
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: my-namespace
subjects:
- kind: User
  name: my-user
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
# 应用角色和角色绑定
$ kubectl apply -f role.yaml
role.rbac.authorization.k8s.io/pod-reader created
$ kubectl apply -f role-binding.yaml
rolebinding.rbac.authorization.k8s.io/read-pods created
15. 总结

通过本文的介绍,你已经了解了 Kubernetes 的基本概念、组件、部署应用的步骤,以及服务发现、负载均衡、持久化存储、自动伸缩和安全权限管理等重要功能。Kubernetes 提供了强大而灵活的工具,帮助你高效地部署和管理容器化应用。

在实际应用中,你可以根据具体需求选择合适的部署策略、服务类型和安全措施,确保应用的高可用性、性能和安全性。同时,不断学习和实践,深入掌握 Kubernetes 的高级特性,将有助于你更好地应对复杂的生产环境。

希望本文能为你在 Kubernetes 的学习和实践中提供有价值的参考,祝你在容器化应用的部署和管理中取得成功!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值