文章目录

  • 安装 kubectl
  • 安装 kubernetes 集群的几种选择
  • 使用 kubectl 查看和切换 context
  • 服务部署(1)使用 kubectl 部署(deployment)
  • 服务部署(2): 使用 kubectl 查看 ReplicaSet 和 Pods
  • 服务部署(3): 使用 kubectl 启动服务(service)
  • 生产环境 k8s 三件套:kubelet, kubectl, kubeadm
  • k8s 基础组件介绍


安装 kubectl

kubectl 是用来与 Kubernetes 集群通讯的命令行工具。通过 Kubectl 可以在 Kubernetes 集群上完成如下操作:

  • 部署和管理应用
  • 查看资源信息
  • 删除和更新组件

kubectl 适配了不同操作系统不同指令架构的安装版本

安装 kubernetes 集群的几种选择

生产环境的 kubernetes 集群安装涉及到较多细节,也不适合在个人机器上安装和学习。开发者学习 kubernetes 可以使用的环境有几种:

  • 使用云厂商提供的套装
  • 在云主机上自己安装和配置
  • 在开发者主机上安装和配置

从成本上来说,在开发者主机上安装和配置是比较方便的。以学习为目的,在个人主机上安装和配置 kubernetes 有两个可选的套装

  • kind: kind 让你能够在本地计算机上运行 Kubernetes。 kind 要求你安装并配置好 Docker。
  • minikube: 与 kind 类似,minikube 是一个工具, 能让你在本地运行 Kubernetes。 minikube 在你本地的个人计算机(包括 Windows、macOS 和 Linux PC)运行一个单节点的 Kubernetes 集群,以便你来尝试 Kubernetes 或者开展每天的开发工作。

kind 或者 minikube 不会安装 kubectl,因此kubectl是需要独立安装的。生产环境上的集群安装和配置则不建议使用 kind 或者 minikube。

使用 kubectl 查看和切换 context

创建了不同名字的 k8s 集群,kubectl 是和哪个集群通讯的呢?可以通过以下命令先看下全局信息。

kubectl config view

内容如下:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://127.0.0.1:60712
  name: kind-hello-k8s
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://127.0.0.1:50225
  name: kind-test
- cluster:
    certificate-authority: /Users/feilong/.minikube/ca.crt
    extensions:
    - extension:
        last-update: Wed, 16 Mar 2022 19:13:01 CST
        provider: minikube.sigs.k8s.io
        version: v1.25.2
      name: cluster_info
    server: https://127.0.0.1:49371
  name: minikube
contexts:
- context:
    cluster: kind-hello-k8s
    user: kind-hello-k8s
  name: kind-hello-k8s
- context:
    cluster: kind-test
    user: kind-test
  name: kind-test
- context:
    cluster: minikube
    extensions:
    - extension:
        last-update: Wed, 16 Mar 2022 19:13:01 CST
        provider: minikube.sigs.k8s.io
        version: v1.25.2
      name: context_info
    namespace: default
    user: minikube
  name: minikube
current-context: kind-hello-k8s
kind: Config
preferences: {}
users:
- name: kind-hello-k8s
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
- name: kind-test
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
- name: minikube
  user:
    client-certificate: /Users/feilong/.minikube/profiles/minikube/client.crt
    client-key: /Users/feilong/.minikube/profiles/minikube/client.key

主要包括这几类信息:

  • clusters 列出了所有的 k8s 集群,例如这里有两个kind创建的集群:kind-hello-k8s 和 kind-test 以及一个 minikube 创建的集群minikube
  • context 列出了每个 k8s 集群对应的上下文信息
  • users 列出了每个 k8s 集群的用户信息
  • current-context 指定了当前 kubectl 连接的集群上下文,这里是 kind-hello-k8s

通过kubectl config get-contexts 查看下有哪些集群上下文,通过kubectl config current-context确认当前 k8s 集群上下文。
通过kubectl get nodes查看当前 kubectl 连接的集群kind-hello-k8s的节点列表。
通过kubectl config use-context kind-test 切换连接的 k8s 集群。

服务部署(1)使用 kubectl 部署(deployment)

在根目录下创建一个 k8s 的部署配置文件,文件是 yaml 格式,文件名为k8s_python_sample_code.deployment.yml,内容如下,注意name字段不能是下划线命名风格:
文件内容案例如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cloud-native-hello-py
  labels:
    app: cloud-native-hello-py
spec:
  replicas: 3
  selector:
    matchLabels:
      app: cloud-native-hello-py
  template:
    metadata:
      labels:
        app: cloud-native-hello-py
    spec:
      containers:
      - name: cloud-native-hello-py
        image: fanfeilong/cloud_native_hello_py
        ports:
        - containerPort: 1024

通过一组操作来部署和查看状态:

  • 使用命令 kubectl create -f k8s.deployment.yaml 部署到 k8s 集群,“部署” 本身被当一种资源创建过程
  • 使用命令 kubectl get deployments 查看部署情况
  • 使用命令kubectl rollout status deployment/cloud-native-hello-py查看状态。

k8s容器名称 k8s容器编排_k8s容器名称

服务部署(2): 使用 kubectl 查看 ReplicaSet 和 Pods

k8s 通过 deployment 部署,deployment 管理副本集合ReplicaSet ,而 ReplicaSet 包含多个Pod。那么Pod又是什么呢?

Pod是一个或多个容器的组合,这些容器共享存储、网络和命名空间,以及如何运行的规范。Pod是 K8s 的最小可部署单元。

通过命令kubectl get rs直观地看下 ReplicaSet

k8s容器名称 k8s容器编排_kubernetes_02

通过命令kubectl get pods直观地看下 pods

k8s容器名称 k8s容器编排_kubernetes_03


可以看到有一个 ReplicaSet,管理三个 Pods。ReplicaSet 管理多个 Pod,确保以指定个数的副本运行部署的服务。

ReplicaSet 的信息解释:

  • NAME:ReplicaSet 名字
  • DESIRED:需要的 pod 副本个数
  • CURRENT:当前运行的 pod 副本个数
  • READY: 有多少个副本对用户可用
  • AGE:运行开始到现在的时间

Pod的列信息大同小异:

  • NAME: 名字
  • READY: 就绪状态
  • STATUS: 运行状态
  • RESTARTS:重启次数
  • AGE:运行开始到现在的时间

服务部署(3): 使用 kubectl 启动服务(service)

经过 deployment,cloud_native_hello_py 项目的目录结构如下:

.
├── Dockerfile
├── README.md
├── k8s.deployment.yaml
└── src
    ├── main.py
    └── requirements.txt

在根目录下增加一个文件k8s.service.yaml,内容如下:

apiVersion: v1
kind: Service
metadata:
  name: cloud-native-hello-py
spec:
  selector:
    app: cloud-native-hello-py
  ports:
    - protocol: TCP
      port: 1024
      targetPort: 1024

注意 targetPort 必须和 deployment 步骤里容器的导出端口一致

使用如下的命令来创建服务

kubectl create -f k8s.service.yaml

k8s容器名称 k8s容器编排_kubernetes_04


对服务做下端口转发

k8s容器名称 k8s容器编排_kubernetes_05


使用浏览器直接访问

k8s容器名称 k8s容器编排_kubernetes_06

生产环境 k8s 三件套:kubelet, kubectl, kubeadm

贡献者:幻灰龙 在生产环境上,例如 centos linux系统上,使用 kubelet, kubectl, kubeadm 三件套可以部署 k8s 集群。
cenos 上安装 k8s 步骤如下:

  • 安装 docker
  • 安装 kubelet, kubectl, kubeadm
  • 使用 kubeadm 初始化集群

例如,安装三件套的命令如下

sudo yum install -y kubectl kubelet kubeadm
sudo systemctl enable kubelet
sudo systemctl start kubelet

使用 kubeadm 初始化集群的命令如下

kubeadm init --apiserver-advertise-address=0.0.0.0 \
--apiserver-cert-extra-sans=127.0.0.1 \
--image-repository=registry.aliyuncs.com/google_containers \
--ignore-preflight-errors=all \
--kubernetes-version=v1.21.1 \
--service-cidr=10.10.0.0/16 \
--pod-network-cidr=10.18.0.0/16

k8s 基础组件介绍

贡献者:幻灰龙 到目前为止,我们从 k8s 命令行安装和操作的角度理解到了 k8s 的很多基本概念:

  • 容器(docker)里可以跑代码
  • pod 可以管理容器(docker)
  • ReplicaSet 可以管理多 pod
  • 通过 deployment 可以部署一个 ReplicaSet
  • deployement 可以通过 service 暴露给集群外
  • k8s的集群节点分 control-plane 和 worker 两种节点

我们也掌握了安装 k8s 的概念

  • kubectl 可以用来和 k8s 集群通讯,是 k8s 的命令行客户端
  • 使用 minikube/kind 可以创建学习环境 k8s 集群
  • 使用 kubeadm 可以创建生产环境 k8s

现在,我们简要介绍下 k8s 的核心组件

  • etcd : 实现了raft分布式一致性协议的元数据存储
  • apiserver: 提供了元数据读写 etcd 的api
  • Controller Manager : 集群内部的控制管理中心
  • Scheduler: 集群内部的调度器,对 pod 进行调度
  • Kubelet:负责 Node 节点上的 pod 的增删查改
  • Proxy: Service的代理