文章目录
- K8S搭建
- 配置要求
- 安装 Kuboard-Spray
- 加载离线资源包
- 规划并安装集群
- 访问集群
- 重启Kubernetes集群
- Worker节点不能启动
- 许多Pod一直Crash或不能正常访问
- containerd配置网络代理
- 常用的 kubectl 命令:
K8S搭建
安装高可用的Kubernetes集群
配置要求
对于 Kubernetes 初学者,在搭建K8S集群时,推荐在阿里云或腾讯云采购如下配置:(您也可以使用自己的虚拟机、私有云等您最容易获得的 Linux 环境)
- 至少 2 台 2核4G 的服务器
- 本文档中,CPU 必须为 x86 架构,暂时未适配 arm 架构的 CPU
- CentOS 7.8、 CentOS 7.9 或 Ubuntu 20.04
操作系统兼容性
CentOS 版本 | 本文档是否兼容 | 备注 |
---|---|---|
CentOS 7.9 | 😄 | 已验证 |
CentOS 7.8 | 😄 | 已验证 |
Ubuntu 20.04 | 😄 | 已验证 |
安装 Kuboard-Spray
-
取一台服务器或虚拟机,执行一条命令,即可完成 Kuboard-Spray 的安装。
对这台服务器的最低要求为:
- 1核2G
- 不少于 10G 磁盘空余空间
- 已经安装好 docker
待执行的命令如下:
docker run -d \ --privileged \ --restart=unless-stopped \ --name=kuboard-spray \ -p 80:80/tcp \ -v /var/run/docker.sock:/var/run/docker.sock \ -v ~/kuboard-spray-data:/data \ eipwork/kuboard-spray:latest-amd64 # 如果抓不到这个镜像,可以尝试一下这个备用地址: # swr.cn-east-2.myhuaweicloud.com/kuboard/kuboard-spray:latest-amd64
持久化
- KuboardSpray 的信息保存在容器的
/data
路径,请将其映射到一个您认为安全的地方,上面的命令中,将其映射到了~/kuboard-spray-data
路径; - 只要此路径的内容不受损坏,重启、升级、重新安装 Kuboard-Spray,或者将数据及 Kuboard-Spray 迁移到另外一台机器上,您都可以找回到原来的信息。
-
在浏览器打开地址
http://这台机器的IP
,输入用户名admin
,默认密码Kuboard123
,即可登录 Kuboard-Spray 界面。
加载离线资源包
-
在 Kuboard-Spray 界面中,导航到
系统设置
-->资源包管理
界面,可以看到已经等候您多时的Kuboard-Spray 离线资源包
,如下图所示:
-
点击
导 入
按钮,在界面的引导下完成资源包的加载。重要
- 权限问题
- 导入资源包时,可能会碰到
no such file or directory
或者permission denied
之类的错误提示,通常是因为您开启了 SELinux,导致 kuboard-spray 不能读取映射到容器/data
的路径
- 导入资源包时,可能会碰到
- 离线导入
- 如果您处在内网环境,上图中的列表默认将是空的,请注意其中的
离线加载资源包
按钮,它可以引导您轻松完成资源包的离线加载过程。
- 如果您处在内网环境,上图中的列表默认将是空的,请注意其中的
- 权限问题
规划并安装集群
-
在 Kuboard-Spray 界面中,导航到
集群管理
界面,点击界面中的添加集群安装计划
按钮,填写表单如下:-
集群名称: 自定义名称,本文中填写为 kuboard123,此名称不可以修改;
-
资源包:选择前面步骤中导入的离线资源包。
-
点击上图对话框中的
确定
按钮后,将进入集群规划页面,在该界面中添加您每个集群节点的连接参数并设置节点的角色,如下图所示:重要: kuboard-spray 所在机器不能当做 K8S 集群的一个节点,因为安装过程中会重启集群节点的容器引擎,这会导致 kuboard-spray 被重启掉。
注意事项
-
最少的节点数量是 1 个;
-
ETCD 节点、控制节点的总数量必须为奇数;
-
在
全局设置
标签页,可以设置节点的通用连接参数,例如所有的节点都使用相同的 ssh 端口、用户名、密码,则共同的参数只在此处设置即可; -
在节点标签页,如果该节点的角色包含
etcd
则必须填写ETCD 成员名称
这个字段; -
如果您 KuboardSpray 所在节点不能直接访问到 Kubernetes 集群的节点,您可以设置跳板机参数,使 KuboardSpray 可以通过 ssh 访问集群节点。
-
集群安装过程中,除了已经导入的资源包以外,还需要使用 yum 或 apt 指令安装一些系统软件,例如 curl, rsync, ipvadm, ipset, ethtool 等,此时要用到操作系统的 apt 软件源或者 yum 软件源。
全局设置
标签页中,可以引导您完成 apt / yum 软件源的设置,您可以:- 使用节点操作系统已经事先配置的 apt / yum 源,或者
- 在安装过程中自动配置节点的操作系统使用指定的软件源
-
如果您使用 docker 作为集群的容器引擎,还需要在
全局设置
标签页指定安装 docker 用的 apt / yum 源。如果您使用 containerd 作为容器引擎,则无需配置 docker 的 apt / yum 源,containerd 的安装包已经包含在 KuboardSpray 离线资源包中。
-
-
点击上图的
保存
按钮,再点击执行
按钮,可以启动集群的离线安装过程,如下图所示:
-
取决于您机器的性能和网络访问速度,大概喝一杯茶的功夫,集群就安装好了,安装成功时,日志界面的显示如下图所示:
-
访问集群
-
如果集群日志界面提示您集群已经安装成功,此时您可以返回到集群规划页面,此界面将自动切换到
访问集群
标签页,如下图所示:界面给出了三种方式可以访问 kubernetes 集群:
- 在集群主节点上执行 kubectl 命令
- 获取集群的 .kubeconfig 文件
- 将集群导入到 kuboard管理界面
重启Kubernetes集群
Kubernetes集群的设计目标是setup-and-run-forever,然而许多学习者使用自己笔记本上的虚拟机安装K8S集群用于学习,这就必然会出现反复重启集群所在虚拟机的情况。本文针对重启后会出现一些的一些令人困惑的问题做了解释。
Worker节点不能启动
Master 节点的 IP 地址变化,导致 worker 节点不能启动。请重装集群,并确保所有节点都有固定内网 IP 地址。
许多Pod一直Crash或不能正常访问
kubectl get pods --all-namespaces
重启后会发现许多 Pod 不在 Running 状态,此时,请使用如下命令删除这些状态不正常的 Pod。通常,您的 Pod 如果是使用 Deployment、StatefulSet 等控制器创建的,kubernetes 将创建新的 Pod 作为替代,重新启动的 Pod 通常能够正常工作。
kubectl delete pod <pod-name> -n <pod-namespece>
containerd配置网络代理
没有配置containerd运行时代理设置。因为K8使用containerd运行时拉取图像。如果您的PC位于代理之后,如果它不直接使用代理系统设置(例如docker,containerd等),您应该始终配置应用设置。
sudo mkdir -p /etc/systemd/system/containerd.service.d
sudo touch /etc/systemd/system/containerd.service.d/http-proxy.conf
vi /etc/systemd/system/containerd.service.d/http-proxy.conf
# 在http-proxy.conf里写入以下配置
[Service]
Environment="HTTP_PROXY=http://xx.x.xx.xxx:xxxx/" "HTTPS_PROXY=http://xx.x.xx.xxx:xxxx/"
"NO_PROXY=localhost,127.0.0.1,192.168.182.xxx"
# 重启containerd服务
sudo systemctl daemon-reload
sudo systemctl restart containerd
sudo systemctl show --property=Environment containerd
常用的 kubectl 命令:
-
kubectl get: 获取资源列表
kubectl get pods
: 获取 Pod 列表kubectl get nodes
: 获取节点列表kubectl get services
: 获取服务列表kubectl get deployments
: 获取部署列表
-
kubectl describe: 显示资源的详细信息
kubectl describe pod <pod-name>
: 显示 Pod 的详细信息kubectl describe node <node-name>
: 显示节点的详细信息kubectl describe service <service-name>
: 显示服务的详细信息
-
kubectl create: 创建资源
kubectl create deployment <name> --image=<image>
: 创建一个部署kubectl create service <name> --tcp=<port>:<targetPort>
: 创建一个服务
-
kubectl delete: 删除资源
kubectl delete pod <pod-name>
: 删除 Podkubectl delete deployment <deployment-name>
: 删除部署kubectl delete service <service-name>
: 删除服务
-
kubectl exec: 在容器内执行命令
kubectl exec -it <pod-name> -- <command>
: 在 Pod 内执行命令
-
kubectl logs: 获取容器日志
kubectl logs <pod-name>
: 获取 Pod 的日志
-
kubectl apply: 应用配置文件
kubectl apply -f <filename>
: 应用配置文件
-
kubectl scale: 调整副本数
kubectl scale deployment <deployment-name> --replicas=<replica-count>
: 调整部署的副本数
-
kubectl rollout: 管理滚动更新
kubectl rollout status deployment/<deployment-name>
: 查看滚动更新状态kubectl rollout history deployment/<deployment-name>
: 查看滚动更新历史kubectl rollout undo deployment/<deployment-name>
: 回滚滚动更新
-
kubectl port-forward: 将本地端口映射到 Pod 端口
kubectl port-forward <pod-name> <local-port>:<pod-port>
: 将本地端口映射到 Pod 的端口