Kubernetes部署(KubeSphere)

有时间写一篇裸二进制部署的,只要你学会了裸部署,很多复杂的部署问题看起来都很简单。

Kubernetes是什么

Kubernetes(K8s)是用于自动部署,扩展和管理容器化应用程序的开源系统。 它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。Kubernetes 源自Google 15 年生产环境的运维经验,同时凝聚了社区的最佳创意和实践。

(星际规模)Google 每周运行数十亿个容器,Kubernetes 基于与之相同的原则来设计,能够在不扩张运维团队的情况下进行规模扩展。

(永不过时)无论是本地测试,还是跨国公司,Kubernetes 的灵活性都能让你在应对复杂系统时得心应手。

(处处运行)Kubernetes 是开源系统,可以自由地部署在企业内部,私有云、混合云或公有云,让您轻松地做出合适的选择。

官网地址:https://kubernetes.io ,开源地址:https://github.com/kubernetes/kubernetes

KubeSphere是什么

KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统,完全开源,支持多云与多集群管理,提供全栈的 IT 自动化运维能力,简化企业的 DevOps 工作流。它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用 (plug-and-play) 的集成。

作为全栈的多租户容器平台,KubeSphere 提供了运维友好的向导式操作界面,帮助企业快速构建一个强大和功能丰富的容器云平台。KubeSphere 为用户提供构建企业级 Kubernetes 环境所需的多项功能,例如多云与多集群管理、Kubernetes 资源管理、DevOps、应用生命周期管理、微服务治理(服务网格)、日志查询与收集、服务与网络、多租户管理、监控告警、事件与审计查询、存储管理、访问权限控制、GPU 支持、网络策略、镜像仓库管理以及安全管理等。

KubeSphere 还开源了 Kubekey 帮助企业一键在公有云或数据中心快速搭建 Kubernetes 集群,提供单节点、多节点、集群插件安装,以及集群升级与运维。

开发运维友好

KubeSphere 为用户屏蔽了基础设施底层复杂的技术细节,帮助企业在各类基础设施之上无缝地部署、更新、迁移和管理现有的容器化应用。通过这种方式,KubeSphere 使开发人员能够专注于应用程序开发,使运维团队能够通过企业级可观测性功能和故障排除机制、统一监控和日志查询、存储和网络管理,以及易用的 CI/CD 流水线等来加快 DevOps 自动化工作流程和交付流程等。

支持在任意平台运行 KubeSphere

作为一个灵活的轻量级容器 PaaS 平台,KubeSphere 对不同云生态系统的支持非常友好,因为它对原生 Kubernetes 本身没有任何的侵入 (Hack)。换句话说,KubeSphere 可以部署并运行在任何基础架构以及所有版本兼容的 Kubernetes 集群之上,包括虚拟机、物理机、数据中心、公有云和混合云等。

您可以选择在公有云和托管 Kubernetes 集群(例如阿里云、AWS、青云QingCloud、腾讯云、华为云等)上安装 KubeSphere,还可以导入和纳管已有的 Kubernetes 集群。

KubeSphere 可以在不修改用户当前的资源或资产、不影响其业务的情况下部署在现有的 Kubernetes 平台上。

官网:https://kubesphere.com.cn ,开源地址:https://github.com/kubesphere/kubesphere

总之一句话:简单化安装K8S,并且有易用的可视化操作界面。

资源要求

  • Ubuntu 16.04, 18.04,20.04(默认安装该版本的Ubuntu),CentOS 7.x
  • 2核CPU
  • 4GB内存
  • 20GB硬盘
  • 互联网,网速要快

建议单机资源越大越好。

优化Linux环境

我们使用 root 用户执行后续操作。

Linux 机器进行初始化,并 调优

通过 ifconfig 可以知道内网IP为:172.16.0.4

确保 SSH 可以访问:

ssh root@172.16.0.4 -p 22222

其中 22222 是由于 sshd 服务器修改了默认端口,默认为 22 端口。

如果无法访问,请添加密钥:

ssh-keygen

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

/var/lib/docker 主要用于存储容器数据,在使用和操作过程中会逐渐增大。对于生产环境,建议 /var/lib/docker 单独挂盘。

安装必备软件

Kubernetes 版本 ≥ 1.18 必须安装以下软件:

apt-get update
apt-get install curl openssl ebtables socat ipset conntrack

准备KubeKey工具

使用工具:https://github.com/kubesphere/kubekey

优势:

  • 基于 Ansible 的安装程序具有大量软件依赖性,例如 Python。KubeKey 是使用 Go 语言开发的,可以消除在各种环境中出现的问题,从而提高安装成功率。
  • KubeKey 使用 Kubeadm 在节点上尽可能多地并行安装 K8s 集群,以降低安装复杂性并提高效率。与较早的安装程序相比,它将大大节省安装时间。
  • KubeKey 支持将集群从 all-in-one 扩展到多节点集群甚至 HA 集群。
  • KubeKey 旨在将集群当作一个对象操作,即 CaaO。

下载 KubeKey 可执行文件 Releases page

可以直接用脚本安装最新的发行二进制(建议):

mkdir k8s && cd k8s
wget https://github.com/kubesphere/kubekey/releases/download/v1.1.0/downloadKubekey.sh
chmod a+x downloadKubekey.sh
./downloadKubekey.sh

另外的方式,从源代码生成二进制文件:

git clone https://github.com/kubesphere/kubekey.git
cd kubekey
./build.sh

源码安装注意:在构建之前,需要先安装 Docker。 如果无法访问 https://proxy.golang.org ,比如在大陆,请执行 build.sh -p

开始安装Kubernetes

在大陆,我们无法访问 https://storage.googleapis.com ,因此先执行:

export KKZONE=cn

我们将安装kubesphere能支持的最新的kubernetes版本

先创建一个配置:

./kk create config --with-kubernetes v1.20.4 --with-kubesphere v3.1.0 -f ./config-sample.yaml

我们修改配置 config-sample.yaml 的一部分,配置一个节点,因为我们是单机部署:

  hosts:
#  - {name: node1, address: 172.16.0.2, internalAddress: 172.16.0.2, port: 8022, user: ubuntu, password: Qcloud@123} # Assume that the default port for SSH is 22, otherwise add the port number after the IP address as above
#  - {name: node2, address: 172.16.0.3, internalAddress: 172.16.0.3, password: Qcloud@123}  # the default root user
  - {name: node1, address: 172.16.0.4, internalAddress: 172.16.0.4, port: 22222, user: root, privateKeyPath: "~/.ssh/id_rsa"} # password-less login with SSH keys
  roleGroups:
    etcd:
    - node1
    master:
    - node1
    worker:
    - node1

其中 172.16.0.4 是机器的内网私有 IP地址。

具体参数含义如下:

name:实例的主机名。

address:任务机和其他实例通过 SSH 相互连接所使用的 IP 地址。根据您的环境,可以是公有 IP 地址或私有 IP 地址。例如,一些云平台为每个实例提供一个公有 IP 地址,用于通过 SSH 访问。在这种情况下,您可以在该字段填入这个公有 IP 地址。

internalAddress:实例的私有 IP 地址。

根据配置开始创建集群:

./kk create cluster -f ./config-sample.yaml


+-------+------+------+---------+----------+-------+-------+-----------+---------+------------+-------------+------------------+--------------+
| name  | sudo | curl | openssl | ebtables | socat | ipset | conntrack | docker  | nfs client | ceph client | glusterfs client | time         |
+-------+------+------+---------+----------+-------+-------+-----------+---------+------------+-------------+------------------+--------------+
| node1 | y    | y    | y       | y        | y     | y     | y         | 20.10.1 |            |             |                  | CST 19:51:07 |
+-------+------+------+---------+----------+-------+-------+-----------+---------+------------+-------------+------------------+--------------+

This is a simple check of your environment.
Before installation, you should ensure that your machines meet all requirements specified at
https://github.com/kubesphere/kubekey#requirements-and-recommendations

Continue this installation? [yes/no]: yes
INFO[19:51:24 CST] Downloading Installation Files
INFO[19:51:24 CST] Downloading kubeadm ...
INFO[19:51:43 CST] Downloading kubelet ...
INFO[19:52:40 CST] Downloading kubectl ...
INFO[19:53:06 CST] Downloading helm ...

#####################################################
###              Welcome to KubeSphere!           ###
#####################################################

Console: http://172.16.0.4:30880
Account: admin
Password: P@88w0rd

NOTES:
  1. After you log into the console, please check the
     monitoring status of service components in
     "Cluster Management". If any service is not
     ready, please wait patiently until all components
     are up and running.
  2. Please change the default password after login.

#####################################################
https://kubesphere.io             2021-05-08 09:58:26
#####################################################
INFO[09:58:36 CST] Installation is complete.

Please check the result using the command:

       kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

根据提示执行命令,检查安装结果:

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

#####################################################
###              Welcome to KubeSphere!           ###
#####################################################
Console: http://172.16.0.4:30880
Account: admin
Password: P@88w0rd

输出信息会显示 Web 控制台的 IP 地址和端口号,默认的 NodePort30880

现在,您可以使用默认的帐户和密码 (admin/P@88w0rd) 通过 IP:30880 访问控制台。

安装完毕后我们就有了一个单机的,带可视化界面 kubespherekubernetes 了。

使用Kubesphere管理Kubernetes

我们可以使用Kubesphere管理Kubernetes,也可以不使用。

打开 http://172.16.0.4:30880

注意:如果是在公有云部署,可以使用公网IP访问,记得安全组开放 30880 端口,或者你可以设置 Nginx 域名进行反向代理。

疑难杂症

发现监控组件没启动:

# 发现有monitor组件没启动
kubectl get pods -n kubesphere-monitoring-system

prometheus-k8s-0                                  0/3     Pending   0          86m

# 查看不启动的原因
kubectl describe pods/prometheus-k8s-0 -n kubesphere-monitoring-system

Events:
  Type     Reason            Age    From               Message
  ----     ------            ----   ----               -------
  Warning  FailedScheduling  4m35s  default-scheduler  0/1 nodes are available: 1 Insufficient cpu.
  Warning  FailedScheduling  4m35s  default-scheduler  0/1 nodes are available: 1 Insufficient cpu.

# 查看节点资源
kubectl describe nodes/node1

Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests      Limits
  --------           --------      ------
  cpu                1557m (97%)   8810m (550%)
  memory             1095Mi (15%)  6939Mi (98%)

CPU资源不足!请扩容或者停掉某些进程。由于资源有限,我们修改 statefulsets CPU配置:

# 获取monitor状态副本集列表
kubectl get statefulsets -n kubesphere-monitoring-system

# 获取那个没启动的monitor状态副本
kubectl describe statefulsets/prometheus-k8s -n kubesphere-monitoring-system

# 编辑CPU配置
kubectl edit  statefulsets/prometheus-k8s -n kubesphere-monitoring-system


        requests:
          cpu: 5m
          memory: 400Mi

之后会自动恢复。

默认创建集群后没有启动应用商店,如何启动参考:https://v3-1.docs.kubesphere.io/zh/docs/pluggable-components/app-store

我们只使用这个可视化平台来查看机器资源,快速查看日志等,我们还是专注于使用Kubernetes本身。

任何问题移步: https://kubesphere.com.cn/forum

卸载全部

有时候,机器是有限的,我们想练手,卸载了再重新安装,可以执行:

./kk delete cluster -f config-sample.yaml
rm -rf ~/.kube

高可用部署

准备六台机器。部署参考 KubeSphere 官网。

kubectl配置及命令

连接远程k8s集群

我们会配置连接多个kubernetes集群。

将kubernetes集群上的 ~/.kube/config 复制到本地机器 ~/.kube/config1~/.kube/config2,修改:

vim config1

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: *****
    # 修改成可访问的外网地址
    server: https://122.12.122.122:6443
  # 重命名,避免与其他集群重复
  name: cluster1
contexts:
- context:
    # 重命名,避免与其他集群重复
    cluster: cluster1
    user: kubernetes-admin
  name: context1
current-context: context1

合成配置:

KUBECONFIG=config1:config2 kubectl config view --flatten > $HOME/.kube/config

查看配置:

kubectl config view

查看当前使用的集群:

kubectl config current-context

切换集群:

kubectl config use-context context1

疑难杂症

开始使用时如果发现:

kubectl get pod
Unable to connect to the server: x509: certificate is valid for 10.233.0.1, 172.16.0.4, 127.0.0.1, not 122.12.122.122

根据这篇讨论可以解决:https://stackoverflow.com/questions/46360361/invalid-x509-certificate-for-kubernetes-master

只要在集群机器执行:

rm /etc/kubernetes/pki/apiserver.*
kubeadm init phase certs all --apiserver-advertise-address=0.0.0.0 --apiserver-cert-extra-sans=lb.kubesphere.local,172.16.0.4,122.12.122.122,10.233.0.1
docker rm -f `docker ps -q -f 'name=k8s_kube-apiserver*'`
systemctl restart kubelet

kubeadm init phase certs all

不推荐解决,可能引入额外的问题。

每次使用可以添加 --insecure-skip-tls-verify 即可:

kubectl --insecure-skip-tls-verify get ns

NAME                              STATUS   AGE
default                           Active   7h7m
jinhan-test                       Active   4h26m
kube-node-lease                   Active   7h7m
kube-public                       Active   7h7m
kube-system                       Active   7h7m
kubesphere-controls-system        Active   7h4m
kubesphere-monitoring-federated   Active   7h4m
kubesphere-monitoring-system      Active   7h6m
kubesphere-system                 Active   7h6m
void-test                         Active   142m

当我们有域名的时候,一切都不是问题!

kubectl命令

查看组件状态:

kubectl get componentstatus

查看支持操作的资源对象:

kubectl api-resources

查看节点列表:

kubectl get nodes

查看某一个节点:

kubectl describe nodes/node1

查看命名空间:

kubectl get ns

查看Pod列表:

kubectl get pods -n kube-system -o wide

查看某一个Pod:

kubectl describe pods/prometheus-k8s-0 -n kubesphere-monitoring-system

查看deployment列表:

kubectl get deployment -n kubesphere-monitoring-system

查看某一个deployment:

kubectl describe deployment/prometheus-operator -n kubesphere-monitoring-system

查看有状态副本集statefulsets:

kubectl get statefulsets -n kubesphere-monitoring-system

查看某一个有状态副本集statefulsets:

kubectl describe statefulsets/prometheus-k8s -n kubesphere-monitoring-system

重启deployment:

kubectl rollout restart deploy/ks-controller-managerm -n kubesphere-systen