14运维掌握容器编排工具 Kubernetes 的基本用法,包括 Pod、Service、Deployment

目录

  • Kubernetes 简介
  • Kubernetes 安装
  • Kubernetes 基本概念
    • Pod
    • Service
    • Deployment
  • Kubernetes 使用案例
    • 部署一个 Web 应用

Kubernetes 简介

Kubernetes 是一个开源的容器编排工具,用于自动化部署、扩展和管理容器化应用程序。它最初是由 Google 开发,并于 2014 年开源,现在由 Cloud Native Computing Foundation(CNCF)维护。

Kubernetes 提供了一种便捷的方式来管理多个容器,可以自动处理容器的部署、升级、容错、伸缩等任务。同时,它还提供了一组强大的 API,可以让用户更加灵活地管理容器。

Kubernetes 安装

Kubernetes 支持在多种操作系统上安装和运行,例如 Linux、macOS 和 Windows。在本教程中,我们以 Ubuntu 18.04 为例,介绍如何在 Ubuntu 18.04 上安装 Kubernetes。

1. 安装 Docker

Kubernetes 使用 Docker 作为容器运行时,因此需要先安装 Docker。

 

bashCopy code

$ sudo apt-get update $ sudo apt-get install -y docker.io

2. 安装 Kubernetes

Kubernetes 的组件包括 kubelet、kubeadm、kubectl 等。可以通过以下命令来安装这些组件:

 

bashCopy code

$ sudo apt-get update && sudo apt-get install -y apt-transport-https curl $ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - $ echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list $ sudo apt-get update $ sudo apt-get install -y kubelet kubeadm kubectl

3. 初始化 Kubernetes 集群

在安装完 Kubernetes 后,需要通过 kubeadm 工具来初始化 Kubernetes 集群。

 

bashCopy code

$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16

其中,--pod-network-cidr 参数指定了 Pod 网络的地址段,这里使用了 Calico 的默认地址段。

初始化成功后,可以通过以下命令来启用 kubelet:

 

bashCopy code

$ sudo systemctl enable kubelet.service

4. 安装 Pod 网络插件

Kubernetes 中的 Pod 需要在一个虚拟网络中进行通信,因此需要安装 Pod 网络插件。

这里我们选择使用 Calico 插件:

 

bashCopy code

$ kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml

5. 加入集群

最后,需要将其他节点加入 Kubernetes 集群。可以通过以下命令来获取加入集群的命令:

 

bashCopy code

$ sudo k

在Kubernetes中,Secret是用于存储敏感数据的对象,例如密码、API密钥和证书等。与ConfigMap一样,Secret也以键值对的形式存储数据,但它的值被Base64编码,以确保安全性。

可以使用以下命令创建一个名为my-secret的Secret对象:

 

csharpCopy code

kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=secret

此命令将创建一个名为my-secret的通用Secret对象,其中包含两个键值对:username=admin和password=secret。

在Pod中使用Secret时,可以通过环境变量或Volume将其注入到容器中。以下是使用环境变量注入Secret的示例:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: nginx
      env:
        - name: USERNAME
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: username
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: password

在此示例中,我们将用户名和密码注入到名为my-container的容器中,并将它们存储在名为USERNAME和PASSWORD的环境变量中。Secret是使用SecretKeyRef对象引用的,该对象定义了要从中提取值的Secret的名称和密钥。

以下是使用Volume将Secret挂载到容器中的示例

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: nginx
      volumeMounts:
        - name: my-secret-volume
          mountPath: /etc/secrets
      env:
        - name: USERNAME
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: username
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: password
  volumes:
    - name: my-secret-volume
      secret:
        secretName: my-secret

在此示例中,我们将名为my-secret的Secret作为Volume挂载到容器的/etc/secrets目录中。Secret是通过其名称引用的,并且在Pod中使用volumes字段定义。

Service

Kubernetes 中的 Service 用于定义一组 Pod 的访问方式。Service 可以将一组 Pod 隐藏起来,使得客户端可以通过 Service 的唯一 IP 地址来访问这些 Pod,而无需知道实际 Pod 的 IP 地址。

Service 的类型

Kubernetes 中的 Service 有四种类型:ClusterIP、NodePort、LoadBalancer 和 ExternalName。

ClusterIP

ClusterIP 是 Service 的默认类型,它将创建一个仅在 Kubernetes 集群内部可访问的虚拟 IP 地址。当访问这个虚拟 IP 地址时,Kubernetes 会将请求负载均衡到 Service 对应的 Pod 上。这种类型的 Service 适用于内部服务之间的通信。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ClusterIP
  selector:
    app: my-app
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80

NodePort

NodePort 类型会在每个 Node 上绑定一个固定的端口,这样可以通过 Node 的 IP 地址和 NodePort 来访问 Service。这种类型的 Service 适用于需要从外部访问 Service 的场景

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30080

LoadBalancer

LoadBalancer 类型会在云平台上创建一个负载均衡器,并将流量转发到 Service 中的 Pod。这种类型的 Service 适用于需要从外部访问 Service 的场景

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80

ExternalName

ExternalName 类型可以将 Service 映射到集群外部的服务地址。这种类型的 Service 适用于需要访问集群外部服务的场景

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ExternalName
  externalName: my-database.example.com
  ports:
    - name: mysql
      protocol: TCP
      port: 3306

Service 的选择器

Service 通过 label selector 与 Pod 建立联系。它使用 label selector 来匹配具有相同标签的 Pod,并将请求转发到这些 Pod 上。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ClusterIP
  selector:
    app: my-app
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玩机科技社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值