文章目录
安装 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的代理