安装 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查看状态。

![](https://img-blog.csdnimg.cn/img_convert/f0b290ba207767c205a9e9583e2dfa70.jpeg#clientId=u9555a8f0-9b4b-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ud5bb16c7&margin=[object Object]&originHeight=370&originWidth=2028&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=ucaba81ce-80ba-40c5-9464-53dcf853db7&title=)

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

k8s 通过 deployment 部署,deployment 管理副本集合ReplicaSet ,而 ReplicaSet 包含多个Pod。那么Pod又是什么呢?
Pod是一个或多个容器的组合,这些容器共享存储、网络和命名空间,以及如何运行的规范。Pod是 K8s 的最小可部署单元。
通过命令kubectl get rs直观地看下 ReplicaSet
![](https://img-blog.csdnimg.cn/img_convert/147d75b4888162f0f3caabcdbbf65988.png#clientId=u9555a8f0-9b4b-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=udf04583e&margin=[object Object]&originHeight=106&originWidth=1436&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=uce6c1ea1-ac89-48ac-a9a7-39d193069e1&title=)

通过命令kubectl get pods直观地看下 pods
![](https://img-blog.csdnimg.cn/img_convert/24e52451b275d58166d82368c7b726f7.png#clientId=u9555a8f0-9b4b-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u7284dc19&margin=[object Object]&originHeight=270&originWidth=1406&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u7efb4a64-18e5-4ebc-9cad-7b35881ac3e&title=)
可以看到有一个 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
![](https://img-blog.csdnimg.cn/img_convert/6b2ee2b8983756368a66577c60c91c30.png#clientId=u9555a8f0-9b4b-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=uf5cd8730&margin=[object Object]&originHeight=78&originWidth=1652&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u442fc1f6-3add-41a8-a00b-8baf2c29dcc&title=)
对服务做下端口转发 ![](https://img-blog.csdnimg.cn/img_convert/d15fdc4a932c9e38fdea9567a3632833.png#clientId=u9555a8f0-9b4b-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ue0e14ab1&margin=[object Object]&originHeight=230&originWidth=2078&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u2c32f3d9-aaaa-412f-9577-3d9c443925a&title=)
使用浏览器直接访问 ![](https://img-blog.csdnimg.cn/img_convert/c1f99d18c19b5d3872fd6e1548715e77.png#clientId=u9555a8f0-9b4b-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u4fc281f7&margin=[object Object]&originHeight=286&originWidth=920&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=uafac6a11-dc58-4e84-a3e9-2731af8aa72&title=)

生产环境 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的代理

参考:https://edu.csdn.net/skill/cloud_native/

【云原生】容器编排K8S-LMLPHP

07-14 08:56