---
url: /diary/k8s/01/index.md
description: Kubernetes 学习笔记第一篇，kubectl 和 minikube 的安装与基础命令使用，本地 K8S 开发环境搭建入门。
---
## 前言

`kubernetes`，简称`K8s`，是用8代替名字中间的8个字符`ubernete`而成的缩写。是一个开源的，用于管理云平台中多个主机上的容器化的应用，
`Kubernetes`的目标是让部署容器化的应用简单并且高效（powerful）,`Kubernetes`提供了应用部署，规划，更新，维护的一种机制。

`minikube` 是本地`Kubernetes`，易于学习和开发，只需要一个`Docker`或虚拟机环境。

## K8S特点

* 可移植: 支持公有云，私有云，混合云，多重云（multi-cloud）
* 可扩展: 模块化，插件化，可挂载，可组合
* 自动化: 自动部署，自动重启，自动复制，自动伸缩/扩展

## 安装K8S安装工具 kubectl

### 安装kubectl本体

> \[!NOTE]
> kubectl 版本和集群版本之间的差异必须在一个小版本号内。 例如：v1.23 版本的客户端能与 v1.22、 v1.23 和 v1.24 版本的控制面通信。
> 用最新兼容版的 kubectl 有助于避免不可预见的问题。

#### Centos

```shell
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

sudo yum install -y kubectl
```

#### 其他

[其他安装方式](https://kubernetes.io/zh/docs/tasks/tools/install-kubectl-linux)

### 安装kubectl插件

`kubectl` 为 `Bash`、`Zsh`、`Fish` 和 `PowerShell` 提供自动补全功能，可以为你节省大量的输入。

#### 安装 bash-completion

```shell
yum install bash-completion
```

#### 启动 kubectl 自动补全功能

```shell
echo 'source <(kubectl completion bash)' >>~/.bashrc
kubectl completion bash >/etc/bash_completion.d/kubectl
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -F __start_kubectl k' >>~/.bashrc
```

### 安装kubectl convert插件

一个 `Kubernetes` 命令行工具 `kubectl` 的插件，允许你将清单在不同 API 版本间转换。 在将清单迁移到具有较新 `Kubernetes`
版本的未弃用 `API` 版本时，这个插件特别有用。

#### 安装最新版

```shell
curl -LO https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl-convert

sudo install -o root -g root -m 0755 kubectl-convert /usr/local/bin/kubectl-convert
```

#### 验证插件是否安装成功

```shell
kubectl convert --help
#若无错误提示 则安装成功
```

## minikube

`minikube` 仅支持单节点，无法很好的去体验`K8S`的自动调度的场景

### 安装minikube

#### 配置需求

| 内容     | 需求                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| CPU    | 2+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| 内存     | 2GB+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| 磁盘空间   | 20GB+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| 网络连接   | 畅通                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| 容器或虚拟机 | [Docker](https://minikube.sigs.k8s.io/docs/drivers/docker/)、[Hyperkit](https://minikube.sigs.k8s.io/docs/drivers/hyperkit/)、[Hyper-V](https://minikube.sigs.k8s.io/docs/drivers/hyperv/)、[KVM](https://minikube.sigs.k8s.io/docs/drivers/kvm2/)、[Parallels](https://minikube.sigs.k8s.io/docs/drivers/parallels/)、[Podman](https://minikube.sigs.k8s.io/docs/drivers/podman/)、[VirtualBox](https://minikube.sigs.k8s.io/docs/drivers/virtualbox/)或[VMware Fusion/Workstation](https://minikube.sigs.k8s.io/docs/drivers/vmware/) |

#### 安装

x86-64

```shell
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
```

ARM64

```shell
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-arm64
sudo install minikube-linux-arm64 /usr/local/bin/minikube
```

ARMv7

```shell
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-arm
sudo install minikube-linux-arm /usr/local/bin/minikube
```

#### 添加用户并切换

The `docker` driver should not be used with `root` privileges.
运行`k8s` 不能在`root`用户上

```shell
adduser k8s
passwd k8s #设置密码
sudo usermod -aG docker k8s #此处默认已安装docker

#添加sudoers权限
visudo
#找到 
root    ALL=(ALL)       ALL
#添加以下
k8s ALL=(ALL) ALL
#保存退出
:wq 

su k8s
```

#### 启动minikube

```shell
minikube start
```

成功提示：

```shell
* Centos 7.9.2009 上的 minikube v1.24.0
* 自动选择 docker 驱动
* Starting control plane node minikube in cluster minikube
* Pulling base image ...
* Downloading Kubernetes v1.22.3 preload ...
    > preloaded-images-k8s-v13-v1...: 501.73 MiB / 501.73 MiB  100.00% 10.10 Mi
    > index.docker.io/kicbase/sta...: 355.78 MiB / 355.78 MiB  100.00% 3.06 MiB
! minikube was unable to download gcr.io/k8s-minikube/kicbase:v0.0.28, but successfully downloaded docker.io/kicbase/stable:v0.0.28 as a fallback image
* Creating docker container (CPUs=2, Memory=2200MB) ...
! This container is having trouble accessing https://k8s.gcr.io
* To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
* 正在 Docker 20.10.8 中准备 Kubernetes v1.22.3…
  - Generating certificates and keys ...
  - Booting up control plane ...
  - Configuring RBAC rules ...
* Verifying Kubernetes components...
  - Using image gcr.io/k8s-minikube/storage-provisioner:v5
* Enabled addons: storage-provisioner, default-storageclass
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
```

#### 与集群交互

```shell
kubectl get po -A
#效果
NAMESPACE              NAME                                         READY   STATUS    RESTARTS        AGE
kube-system            coredns-78fcd69978-xzxmd                     1/1     Running   0               3m43s
kube-system            etcd-minikube                                1/1     Running   0               3m59s
kube-system            kube-apiserver-minikube                      1/1     Running   0               3m57s
kube-system            kube-controller-manager-minikube             1/1     Running   0               3m56s
kube-system            kube-proxy-llbrn                             1/1     Running   0               3m43s
kube-system            kube-scheduler-minikube                      1/1     Running   0               3m57s
kube-system            storage-provisioner                          1/1     Running   1 (3m22s ago)   3m56s
kubernetes-dashboard   dashboard-metrics-scraper-5594458c94-27thx   1/1     Running   0               2m17s
kubernetes-dashboard   kubernetes-dashboard-654cf69797-w55b4        1/1     Running   0               2m17s
```

#### 部署一个项目

* 创建一个实例部署，例如：hexo

  ```shell
  #使用一个hexo镜像进行部署
  kubectl create deployment hexo --image=taskbjorn/hexo
  kubectl expose deployment hexo --type=NodePort --port=4000 #此处为容器内部端口
  ```
* 端口转发,使用容器部署的机器8080端口访问

  ```shell
  kubectl port-forward service/hexo 8080:4000

  localhost:8080
  ```

#### 部署一个可以负载均衡的项目

* 创建一个负载均衡项目，例如：hexo

  ```shell
  kubectl create deployment hexo-balanced --image=taskbjorn/hexo
  kubectl expose deployment hexo-balanced --type=LoadBalancer --port=4000
  ```
* 启动隧道命令来访问负载均衡部署

  ```shell
  minikube tunnel


  Status:
          machine: minikube
          pid: 67514
          route: 10.96.0.0/12 -> 192.168.49.2
          minikube: Running
          services: [hexo-balanced]
      errors:
                  minikube: no errors
                  router: no errors
                  loadbalancer emulator: no errors
  Status:
          machine: minikube
          pid: 67514
          route: 10.96.0.0/12 -> 192.168.49.2
          minikube: Running
          services: [hexo-balanced]
      errors:
                  minikube: no errors
                  router: no errors
                  loadbalancer emulator: no errors
  ```
* 获取路由的ip，并通过一下命令通过`EXTERNAL-IP` 访问

  ```shell
  kubectl get services balanced

  NAME            TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)          AGE
  hexo-balanced   LoadBalancer   10.100.43.73   10.100.43.73   4000:31070/TCP   12m
  ```

  访问地址为：`10.100.43.73:4000`

### 管理集群

#### 暂停Kubernetes

在不影响部署的应用程序情况下

```shell
minikube pause


* Pausing node minikube ...
* Paused 18 containers in: kube-system, kubernetes-dashboard, storage-gluster, istio-operator
```

可见`minikube`基础服务已停止，但是以上已部署的 `hexo` 、` hexo-balanced` 仍然可以正常访问

#### 取消暂停

可以理解为上节的反向操作

```shell
minikube unpause
```

#### 停止集群

此命令将所有的服务将暂停

```shell
minikube stop
```

#### 增加默认内存限制

需要重启

```shell
minikube config set memory 16384
```

#### 浏览易于安装的 K8S 服务目录

```shell
minikube addons list
```

* 开启一个服务

  ```shell
  minikube addons enable <name>
  ```
* 启动是启动插件

  ```shell
  minikube start --addons <name1> --addons <name2>
  ```
* 禁用插件

  ```shell
  minikube addons disable <name>
  ```
* 快速打开浏览器断点插件

  ```shell
  minikube addons open <name>
  ```

#### 删除所有 minikube 集群

> \[!warning]
> 慎用

```shell
minikube delete --all
```
