From 7779473e33445d2a05be27b3100d04814c4e26ea Mon Sep 17 00:00:00 2001 From: Felixnoo Date: Fri, 15 Jan 2021 16:44:41 +0800 Subject: [PATCH] Air-Gapped Upgrade with ks-installer translated. Signed-off-by: Felixnoo --- .../air-gapped-upgrade-with-ks-installer.md | 86 ++++++++---------- .../kubesphere-login.PNG | Bin 0 -> 25533 bytes 2 files changed, 36 insertions(+), 50 deletions(-) create mode 100644 static/images/docs/zh-cn/upgrade/air-gapped-upgrade-with-ks-installer/kubesphere-login.PNG diff --git a/content/zh/docs/upgrade/air-gapped-upgrade-with-ks-installer.md b/content/zh/docs/upgrade/air-gapped-upgrade-with-ks-installer.md index f0338ed89..659ab1116 100644 --- a/content/zh/docs/upgrade/air-gapped-upgrade-with-ks-installer.md +++ b/content/zh/docs/upgrade/air-gapped-upgrade-with-ks-installer.md @@ -1,47 +1,33 @@ --- title: "使用 ks-installer 离线升级" -keywords: "Air-Gapped, upgrade, kubesphere, v3.0.0" -description: "Air-Gapped Upgrade KubeSphere" +keywords: "离线环境, 升级, kubesphere, v3.0.0" +description: "离线升级 KubeSphere" linkTitle: "使用 ks-installer 离线升级" weight: 7500 --- -ks-installer is recommended for users whose Kubernetes clusters were not set up via [KubeSphere Installer](https://v2-1.docs.kubesphere.io/docs/installation/all-in-one/#step-2-download-installer-package), but hosted by cloud vendors. This tutorial is for **upgrading KubeSphere only**. Cluster operators are responsible for upgrading Kubernetes themselves beforehand. +对于 Kubernetes 集群不是通过 [KubeSphere Installer](https://v2-1.docs.kubesphere.io/docs/zh-CN/installation/all-in-one/#第二步-准备安装包) 部署而是由云厂商托管的用户,推荐使用 ks-installer。本教程**只用于升级 KubeSphere**。集群运维员应负责提前升级 Kubernetes。 -## Prerequisites +## 准备工作 -- You need to have a KubeSphere cluster running version 2.1.1. +- 您需要有一个运行在 v2.1.1 版本的 KubeSphere 集群。如果您的 KubeSphere 是 v2.1.0 或更早的版本,请先升级至 v2.1.1。 + +- Docker 仓库。您需要有一个 Harbor 或其他 Docker 仓库。有关更多信息,请参见[准备一个私有镜像仓库](../../installing-on-linux/introduction/air-gapped-installation/#步骤-2准备一个私有镜像仓库)。 + +- 请仔细阅读 [v3.0.0 发布说明](../../release/release-v300/)。 {{< notice warning >}} -If your KubeSphere version is v2.1.0 or earlier, please upgrade to v2.1.1 first. +在 v3.0.0 版本中,KubeSphere 重构了许多组件,例如 Fluent Bit Operator 和 IAM。如果您的这些组件有深度自定义配置(并非通过 KubeSphere 控制台配置),请务必先备份重要组件。 {{}} -- Docker Registry +## 步骤 1:准备安装镜像 -You need to have a harbor or other Docker registry. +当您在离线环境中安装 KubeSphere 时,需要事先准备一个包含所有必需镜像的镜像包。 -{{< notice tip >}} - -You can [quick start yourself docker registry](https://kubesphere.io/docs/installing-on-linux/introduction/air-gapped-installation/#step-2-prepare-a-private-image-registry) - -{{}} - -- Make sure you read [Release Notes For 3.0.0](../../release/release-v300/) carefully. - -{{< notice warning >}} - -In v3.0.0, KubeSphere refactors many of its components such as Fluent Bit Operator and IAM. Make sure you back up any important components in case you heavily customized them but not from console. - -{{}} - -## Step 1: Prepare Installation Images - -As you install KubeSphere in an air-gapped environment, you need to prepare an image package containing all the necessary images in advance. - -1. Download the image list file `images-list.txt` from a machine that has access to the Internet through the following command: +1. 使用以下命令从能够访问互联网的机器上下载镜像清单文件 `images-list.txt`: ```bash curl -L -O https://github.com/kubesphere/ks-installer/releases/download/v3.0.0/images-list.txt @@ -49,23 +35,23 @@ As you install KubeSphere in an air-gapped environment, you need to prepare an i {{< notice note >}} - This file lists images under `##+modulename` based on different modules. You can add your own images to this file following the same rule. To view the complete file, see [Appendix](../../installing-on-linux/introduction/air-gapped-installation/#image-list-of-kubesphere-v300). + 该文件根据不同的模块列出了 `##+modulename` 下的镜像。您可以按照相同的规则把自己的镜像添加到这个文件中。要查看完整文件,请参见[附录](../../installing-on-kubernetes/on-prem-kubernetes/install-ks-on-linux-airgapped/#kubesphere-v300-镜像清单)。 {{}} -2. Download `offline-installation-tool.sh`. +2. 下载 `offline-installation-tool.sh`。 ```bash curl -L -O https://github.com/kubesphere/ks-installer/releases/download/v3.0.0/offline-installation-tool.sh ``` -3. Make the `.sh` file executable. +3. 使 `.sh` 文件可执行。 ```bash chmod +x offline-installation-tool.sh ``` -4. You can execute the command `./offline-installation-tool.sh -h` to see how to use the script: +4. 您可以执行命令 `./offline-installation-tool.sh -h` 来查看如何使用脚本: ```bash root@master:/home/ubuntu# ./offline-installation-tool.sh -h @@ -83,7 +69,7 @@ As you install KubeSphere in an air-gapped environment, you need to prepare an i -h : usage message ``` -5. Pull images in `offline-installation-tool.sh`. +5. 在 `offline-installation-tool.sh` 中拉取镜像。 ```bash ./offline-installation-tool.sh -s -l images-list.txt -d ./kubesphere-images @@ -91,13 +77,13 @@ As you install KubeSphere in an air-gapped environment, you need to prepare an i {{< notice note >}} - You can choose to pull images as needed. For example, you can delete `##k8s-images` and related images under it in `images-list.text` as you already have a Kubernetes cluster. + 您可以根据需要选择拉取的镜像。例如,如果已经有一个 Kubernetes 集群了,您可以在 `images-list.text` 中删除 `##k8s-images` 和在它下面的相关镜像。 {{}} -## Step 2: Push Images to Private Registry +## 步骤 2:推送镜像至您的私有仓库 -Transfer your packaged image file to your local machine and execute the following command to push it to the registry. +将打包的镜像文件传输至您的本地机器,并运行以下命令把它推送至仓库。 ```bash ./offline-installation-tool.sh -l images-list.txt -d ./kubesphere-images -r dockerhub.kubekey.local @@ -105,22 +91,22 @@ Transfer your packaged image file to your local machine and execute the followin {{< notice note >}} -The domain name is `dockerhub.kubekey.local` in the command. Make sure you use your **own registry address**. +命令中的域名是 `dockerhub.kubekey.local`。请确保使用您**自己仓库的地址**。 {{}} -## Step 3: Download Deployment Files +## 步骤 3:下载部署文件 -Similar to installing KubeSphere on an existing Kubernetes cluster in an online environment, you also need to download `cluster-configuration.yaml` and `kubesphere-installer.yaml` first. +与在现有 Kubernetes 集群上在线安装 KubeSphere 相似,您也需要事先下载 `cluster-configuration.yaml` 和 `kubesphere-installer.yaml`。 -1. Execute the following commands to download these two files and transfer them to your machine that serves as the taskbox for installation. +1. 执行以下命令下载这两个文件,并将它们传输至您充当任务机的机器,用于安装。 ```bash curl -L -O https://github.com/kubesphere/ks-installer/releases/download/v3.0.0/cluster-configuration.yaml curl -L -O https://github.com/kubesphere/ks-installer/releases/download/v3.0.0/kubesphere-installer.yaml ``` -2. Edit `cluster-configuration.yaml` to add your private image registry. For example, `dockerhub.kubekey.local` is the registry address in this tutorial, then use it as the value of `.spec.local_registry` as below: +2. 编辑 `cluster-configuration.yaml` 添加您的私有镜像仓库。例如,本教程中的仓库地址是 `dockerhub.kubekey.local`,将它用作 `.spec.local_registry` 的值,如下所示: ```yaml spec: @@ -133,11 +119,11 @@ Similar to installing KubeSphere on an existing Kubernetes cluster in an online {{< notice note >}} - You can enable pluggable components in this YAML file to explore more features of KubeSphere. Refer to [Enable Pluggle Components](../../pluggable-components) for more details. + 您可以在该 YAML 文件中启用可插拔组件,体验 KubeSphere 的更多功能。有关详情,请参考[启用可插拔组件](../../pluggable-components/)。 {{}} -3. Save `cluster-configuration.yaml` after you finish editing. Replace `ks-installer` with your **own registry address** with the following command: +3. 编辑完成后保存 `cluster-configuration.yaml`。使用以下命令将 `ks-installer` 替换为您**自己仓库的地址**。 ```bash sed -i "s#^\s*image: kubesphere.*/ks-installer:.*# image: dockerhub.kubekey.local/kubesphere/ks-installer:v3.0.0#" kubesphere-installer.yaml @@ -145,21 +131,21 @@ Similar to installing KubeSphere on an existing Kubernetes cluster in an online {{< notice warning >}} - `dockerhub.kubekey.local` is the registry address in the command. Make sure you use your own registry address. + 命令中的仓库地址是 `dockerhub.kubekey.local`。请确保使用您自己仓库的地址。 {{}} -## Step 4: Upgrade Kubesphere +## 步骤 4:升级 KubeSphere -Execute the following commands after you make sure that all steps above are completed. +确保上述所有步骤都已完成后,执行以下命令。 ```bash kubectl apply -f kubesphere-installer.yaml && kubectl apply -f cluster-configuration.yaml ``` -## Step 5: Verify Installation +## 步骤 5:验证安装 -When the installation finishes, you can see the content as follows: +安装完成后,您会看到以下内容: ```bash ##################################################### @@ -183,12 +169,12 @@ https://kubesphere.io 20xx-xx-xx xx:xx:xx ##################################################### ``` -Now, you will be able to access the web console of KubeSphere through `http://{IP}:30880` with the default account and password `admin/P@88w0rd`. +现在,您可以通过 `http://{IP}:30880` 使用默认帐户和密码 `admin/P@88w0rd` 访问 KubeSphere 的 Web 控制台。 {{< notice note >}} -To access the console, make sure port 30880 is opened in your security group. +要访问控制台,请确保在您的安全组中打开端口 30880。 {{}} -![kubesphere-login](https://ap3.qingstor.com/kubesphere-website/docs/login.png) \ No newline at end of file +![KubeSphere 登录](/images/docs/zh-cn/upgrade/air-gapped-upgrade-with-ks-installer/kubesphere-login.PNG) \ No newline at end of file diff --git a/static/images/docs/zh-cn/upgrade/air-gapped-upgrade-with-ks-installer/kubesphere-login.PNG b/static/images/docs/zh-cn/upgrade/air-gapped-upgrade-with-ks-installer/kubesphere-login.PNG new file mode 100644 index 0000000000000000000000000000000000000000..aa6d8991ca11637106eaa9943e290651e96ab811 GIT binary patch literal 25533 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 literal 0 HcmV?d00001