K8S 1.18 离线部署实践:一步步教你如何实现关键词
==================================================

作为一名经验丰富的开发者,很高兴能够帮助到你。在本文中,我将向你展示如何通过离线部署的方式实现K8S关键词【k8s 1.18 离线部署】。我们将按照以下步骤逐步介绍实现的过程:

1. 准备离线环境
2. 下载所需软件包
3. 准备镜像仓库
4. 安装 Docker
5. 安装 Kubernetes&etcd
6. 配置 Kubernetes Master
7. 配置 Kubernetes Worker
8. 配置网络插件
9. 部署应用

接下来,我们将详细讲解每一步需要做什么,以及需要使用的代码。废话不多说,让我们开始:

## 1. 准备离线环境

在开始之前,我们需要准备一个离线环境。这个环境可以是一个虚拟机,也可以是一个物理机。确保环境中已经安装了Linux操作系统,例如Ubuntu 18.04。

## 2. 下载所需软件包

首先,我们需要下载K8S 1.18版本的软件包以及其他所需的软件包。以下是我们需要下载的软件包:

- kubernetes-server-linux-amd64.tar.gz:包含了Kubernetes的二进制文件和配置文件;
- docker-ce-cli_19.03.8~3-0~ubuntu-bionic_amd64.deb:Docker CLI客户端;
- docker-ce_19.03.8~3-0~ubuntu-bionic_amd64.deb:Docker引擎;
- etcd-v3.4.3-linux-amd64.tar.gz:etcd的二进制文件;
- cni-plugins-linux-amd64-v0.7.1.tgz:网络插件;
- kube-flannel.yml:Flannel网络插件配置文件。

你可以在官方网站上下载这些软件包,也可以在镜像网站上下载。确保下载的软件包与你要部署的Kubernetes版本兼容。

## 3. 准备镜像仓库

在准备镜像仓库之前,我们需要先安装一个HTTP服务器,以便将我们下载好并准备好的软件包提供给离线环境。

可以使用以下命令来安装Apache2 HTTP服务器:

```shell
sudo apt-get update
sudo apt-get install apache2
```
安装完成后,将软件包复制到Apache2的默认目录“/var/www/html/”中:

```shell
sudo cp kubernetes-server-linux-amd64.tar.gz docker-ce-cli_19.03.8~3-0~ubuntu-bionic_amd64.deb docker-ce_19.03.8~3-0~ubuntu-bionic_amd64.deb etcd-v3.4.3-linux-amd64.tar.gz cni-plugins-linux-amd64-v0.7.1.tgz kube-flannel.yml /var/www/html/
```

## 4. 安装 Docker

在开始安装Docker之前,确保你的Linux操作系统已经安装了以下软件包:apt-transport-https、ca-certificates、curl、software-properties-common。

使用以下命令来设置Docker的官方GPG密钥:

```shell
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

添加Docker的Apt库:

```shell
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
```

更新Apt索引并安装Docker:

```shell
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
```

## 5. 安装 Kubernetes&etcd

首先,创建一个Kubernetes配置目录和etcd数据目录:

```shell
sudo mkdir -p /etc/kubernetes
sudo mkdir -p /var/lib/etcd
```

接下来,将下载好的kubernetes-server-linux-amd64.tar.gz和etcd-v3.4.3-linux-amd64.tar.gz解压到对应的目录:

```shell
sudo tar -xvf kubernetes-server-linux-amd64.tar.gz -C /etc/kubernetes/
sudo tar -xvf etcd-v3.4.3-linux-amd64.tar.gz -C /var/lib/etcd/
```

配置etcd的环境变量:

```shell
echo "export PATH=$PATH:/var/lib/etcd/etcd-v3.4.3-linux-amd64" | sudo tee -a /etc/profile
. /etc/profile
```

## 6. 配置 Kubernetes Master

在配置Kubernetes Master之前,我们需要先设置Master节点的主机名。然后在/etc/hosts文件中添加Master和Worker节点的映射关系。

编辑/etc/hosts文件:

```shell
sudo nano /etc/hosts
```

在文件中添加以下内容,并将具体的IP地址替换为实际的IP地址:

```
master
worker1
worker2
```

创建一个初始化Master节点的脚本:

```shell
sudo nano init-master.sh
```

添加以下内容:

```shell
#!/bin/bash
kubeadm init --apiserver-advertise-address= --pod-network-cidr=10.244.0.0/16
```

保存并退出。

赋予脚本可执行权限:

```shell
sudo chmod +x init-master.sh
```

运行脚本:

```shell
sudo ./init-master.sh
```

等待初始化完成后,会显示出加入集群的命令。将这个命令保存起来,稍后我们将在Worker节点使用。

## 7. 配置 Kubernetes Worker

在配置Kubernetes Worker之前,我们需要先设置Worker节点的主机名。然后在/etc/hosts文件中添加Master和Worker节点的映射关系。

编辑/etc/hosts文件:

```shell
sudo nano /etc/hosts
```

在文件中添加以下内容,并将具体的IP地址替换为实际的IP地址:

```
master
worker1
worker2
```

创建一个加入集群的脚本:

```shell
sudo nano join-worker.sh
```

添加之前保存的加入集群的命令:

```shell
#!/bin/bash

```

保存并退出。

赋予脚本可执行权限:

```shell
sudo chmod +x join-worker.sh
```

运行脚本:

```shell
sudo ./join-worker.sh
```

## 8. 配置网络插件

在准备部署应用之前,我们需要配置网络插件。我们将使用Flannel作为网络插件。

创建一个网络插件的配置文件:

```shell
sudo nano kube-flannel.yml
```

添加以下内容:

```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-flannel-cfg
namespace: kube-system
labels:
tier: node
app: flannel
data:
cni-conf.json: |
{
"name": "cbr0",
"cniVersion": "0.2.0",
"plugins": [
{
"type": "flannel",
"delegate": {
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
```

保存并退出。

应用网络插件配置:

```shell
kubectl apply -f kube-flannel.yml
```

## 9. 部署应用

现在,我们已经成功地安装了Kubernetes并配置了网络插件。我们可以使用kubectl命令来部署我们的应用了。

首先,我们需要编写一个应用的配置文件。例如,我们可以创建一个hello-world的Deployment配置文件:

```shell
sudo nano hello-world-deployment.yml
```

添加以下内容:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world-deployment
spec:
replicas: 3
selector:
matchLabels:
app: hello-world
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: hello-world
ports:
- containerPort: 80
```

保存并退出。

应用应用的配置文件:

```shell
kubectl apply -f hello-world-deployment.yml
```

现在,我们已经成功地部署了一个简单的应用。

总结
====

恭喜你,现在你已经知道如何通过离线部署的方式实现K8S关键词【k8s 1.18 离线部署】啦!在本文中,我们向你展示了整个部署的流程,并提供了每一步所需的代码示例。希望这篇文章对于你入门Kubernetes有所帮助。

当然,离线部署是一个复杂的过程,还有更多值得探索和学习的地方。如果你对Kubernetes感兴趣,我鼓励你深入学习,掌握更多关于Kubernetes的知识。祝你在Kubernetes的学习和实践中取得成功!