安装 kubernetes
1 | bash复制代码#查看系统 |
准备开始
- 一台或多台运行着下列系统的机器:
- Ubuntu 16.04+
- Debian 9+
- CentOS 7
- Red Hat Enterprise Linux (RHEL) 7
- Fedora 25+
- HypriotOS v1.0.1+
- Container Linux (测试 1800.6.0 版本)
- 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响您应用的运行内存)
- 2 CPU 核或更多
- 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
- 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里 了解更多详细信息。
- 开启机器上的某些端口。请参见这里 了解更多详细信息。
- 禁用交换分区。为了保证 kubelet 正常工作,您 必须 禁用交换分区。
关闭防火墙、swap
需要关闭所有主机的防火墙
1 | bash复制代码sudo ufw disable |
需要关闭所有主机的关闭 swap
Kubernetes 1.8开始要求必须禁用Swap,如果不关闭,默认配置下kubelet将无法启动。将 /etc/fstab
中的这一行注释掉
1 | bash复制代码root@master:/etc/docker# cat /etc/fstab |
1 | bash复制代码#执行 |
Ubuntu中的root帐号
Ubuntu中的root帐号默认是被禁用了的,所以登陆的时候没有这个账号
打开终端开启root账户
1 | bash复制代码sudo passwd -u root |
确保每个节点上 MAC 地址和 product_uuid 的唯一性
- 您可以使用命令
ip link
或ifconfig -a
来获取网络接口的 MAC 地址 - 可以使用
sudo cat /sys/class/dmi/id/product_uuid
命令对 product_uuid 校验
一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。Kubernetes 使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。
检查网络适配器
如果您有一个以上的网络适配器,同时您的 Kubernetes 组件通过默认路由不可达,我们建议您预先添加 IP 路由规则,这样 Kubernetes 集群就可以通过对应的适配器完成连接。
确保 iptables 工具不使用 nftables 后端
在 Linux 中,nftables 当前可以作为内核 iptables 子系统的替代品。 iptables
工具可以充当兼容性层,其行为类似于 iptables 但实际上是在配置 nftables。 nftables 后端与当前的 kubeadm 软件包不兼容:它会导致重复防火墙规则并破坏 kube-proxy
。
如果您系统的 iptables
工具使用 nftables 后端,则需要把 iptables
工具切换到“旧版”模式来避免这些问题。 默认情况下,至少在 Debian 10 (Buster)、Ubuntu 19.04、Fedora 29 和较新的发行版本中会出现这种问题。RHEL 8 不支持切换到旧版本模式,因此与当前的 kubeadm 软件包不兼容。
1 | bash复制代码update-alternatives --set iptables /usr/sbin/iptables-legacy |
修改主机名、更新host
1 | bash复制代码sudo vi /etc/hostname |
安装 runtime
从 v1.6.0 版本起,Kubernetes 开始默认允许使用 CRI(容器运行时接口)。
从 v1.14.0 版本起,kubeadm 将通过观察已知的 UNIX 域套接字来自动检测 Linux 节点上的容器运行时。 下表中是可检测到的正在运行的 runtime 和 socket 路径。
运行时 | 域套接字 |
---|---|
Docker | /var/run/docker.sock |
containerd | /run/containerd/containerd.sock |
CRI-O | /var/run/crio/crio.sock |
如果同时检测到 docker 和 containerd,则优先选择 docker。 这是必然的,因为 docker 18.09 附带了 containerd 并且两者都是可以检测到的。 如果检测到其他两个或多个运行时,kubeadm 将以一个合理的错误信息退出。
在非 Linux 节点上,默认使用 docker 作为容器 runtime。
如果选择的容器 runtime 是 docker,则通过内置 dockershim
CRI 在 kubelet
的内部实现其的应用。
基于 CRI 的其他 runtimes 有:
- containerd (containerd 的内置 CRI 插件)
- cri-o
- frakti
请参考 CRI 安装指南获取更多信息。
安装Docker
在你每个节点(所有主机)上安装 Docker CE.
Kubernetes 发行说明中列出了 Docker 的哪些版本与该版本的 Kubernetes 相兼容。
在你的操作系统上使用如下命令安装 Docker:
1 | bash复制代码# (安装 Docker CE) |
如果你想开机即启动 docker 服务,执行以下命令:
1 | bash复制代码sudo systemctl enable docker |
请参阅 官方 Docker 安装指南 来获取更多的信息。
安装 kubeadm、kubelet 和 kubectl
您需要在每台机器上安装以下的软件包:
kubeadm
:用来初始化集群的指令。kubelet
:在集群中的每个节点上用来启动 pod 和容器等。kubectl
:用来与集群通信的命令行工具。
kubeadm 不能 帮您安装或者管理 kubelet
或 kubectl
,所以您需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与 kubelet 间的相差一个次要版本不一致是支持的,但 kubelet 的版本不可以超过 API 服务器的版本。 例如,1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服务器,反之则不可以。
有关安装 kubectl
的信息,请参阅安装和设置 kubectl文档。
警告:
这些指南不包括系统升级时使用的所有 Kubernetes 程序包。这是因为 kubeadm 和 Kubernetes 有特殊的升级注意事项。
添加阿里源
由于国外网站访问较慢容易卡死,所以需要添加源。
在 /etc/apt/sources.list
中添加:
1 | bash复制代码vi /etc/apt/sources.list |
添加源的 key :
1 | bash复制代码curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add - |
更新源:
1 | bash复制代码sudo apt-get update |
开始安装
1 | bash复制代码sudo apt-get install -y kubelet kubeadm kubectl |
启动 kubelet
:
1 | bash复制代码systemctl start kubelet |
部署(master)节点
查看 kubernetes 所需镜像列表
1 | bash复制代码#取最新版所需镜像列表 |
执行 init
1 | bash复制代码kubeadm init --kubernetes-version=v1.20.0 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 |
失败重试
若执行失败,可执行如下命令,清除执行 init
产生的垃圾
1 | bash复制代码kubeadm reset |
root 用户
Alternatively, if you are the root
user, you can run:
1 | bash复制代码export KUBECONFIG=/etc/kubernetes/admin.conf |
非root用户操作 kubectl
部署成功后,如果我们想使用非root用户操作 kubectl
,可以使用以下命令,这也是 kubeadm init
输出的一部分
不然会报: The connection to the server localhost:8080 was refused
1 | bash复制代码mkdir -p $HOME/.kube |
node节点执行join
在node节点执行命令
1 | bash复制代码kubeadm join 192.168.39.3:6443 --token 973slm.bl1aa33bx0wns5sj \ |
join过程
1 | bash复制代码root@node2:/# kubectl get nodes |
查看节点状态
在 master 节点查看节点状态:
1 | bash复制代码#可以看到所有节点都处于 未就绪 状态。 |
安装 Pod 网络附加组件
注意:
本节包含有关网络设置和部署顺序的重要信息。 在继续之前,请仔细阅读所有建议。
你必须部署一个基于 Pod 网络插件的 容器网络接口 (CNI),以便你的 Pod 可以相互通信。 在安装网络之前,集群 DNS (CoreDNS) 将不会启动。
- 注意你的 Pod 网络不得与任何主机网络重叠: 如果有重叠,你很可能会遇到问题。 (如果你发现网络插件的首选 Pod 网络与某些主机网络之间存在冲突, 则应考虑使用一个合适的 CIDR 块来代替, 然后在执行
kubeadm init
时使用--pod-network-cidr
参数并在你的网络插件的 YAML 中替换它)。- 默认情况下,
kubeadm
将集群设置为使用和强制使用 RBAC(基于角色的访问控制)。 确保你的 Pod 网络插件支持 RBAC,以及用于部署它的 manifests 也是如此。- 如果要为集群使用 IPv6(双协议栈或仅单协议栈 IPv6 网络), 请确保你的Pod网络插件支持 IPv6。 IPv6 支持已在 CNI v0.6.0 版本中添加。
说明: 目前 Calico 是 kubeadm 项目中执行 e2e 测试的唯一 CNI 插件。 如果你发现与 CNI 插件相关的问题,应在其各自的问题跟踪器中记录而不是在 kubeadm 或 kubernetes 问题跟踪器中记录。
Kubernetes 网络模型 的附加组件列表
Flannel 是一个非常简单的能够满足 Kubernetes 所需要的覆盖网络。已经有许多人报告了使用 Flannel 和 Kubernetes 的成功案例。
你可以使用以下命令在控制平面节点或具有 kubeconfig 凭据的节点上安装 Pod 网络附加组件:
1 | bash复制代码#搭建 flannel 网络集群,原文内容在:https://github.com/coreos/flannel#flannel |
执行过程
1 | bash复制代码root@master:/opt/k8syaml# kubectl apply -f kube-flannel.yml |
此时再次查看节点状态,全部已就绪:
1 | bash复制代码root@master:/opt/k8syaml# kubectl get nodes |
如果出现以下报错:
Unable to connect to the server: read tcp 192.168.20.5:37246->151.101.228.133:443: read: connection reset by peer
可以安装 apt-get install ca-certificates
和 apt-get install ssl-cert
解决。
1 | bash复制代码# 若是下载不了flannel镜像但是本地docker有的话, yml文件修改镜像源优先来源本地imagePullPolicy: IfNotPresent |
测试k8s集群
1 | bash复制代码kubectl create deployment nginx --image=nginx |
Dashboard UI
Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源 (如 Deployment,Job,DaemonSet 等等)。 例如,你可以对 Deployment 实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。
Dashboard 同时展示了 Kubernetes 集群中的资源状态信息和所有报错信息
部署 Dashboard UI
默认情况下不会部署 Dashboard。可以通过以下命令部署:
1 | bash复制代码kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml |
虚拟机访问不了,可以在网页打开,在虚拟机内创建个文件,把内容copy进去,即可。
如果远程下载不了,可以本地加载镜像,在recommended.yaml
中只需要在image下一行,加上:imagePullPolicy: IfNotPresent
意思是优先使用本地镜像。
1 | bash复制代码root@master:/opt/k8syaml# vi recommended.yaml |
有时候镜像下载比较慢,可以单独下载docker pull kubernetesui/metrics-scraper:v1.0.4
docker pull kubernetesui/dashboard:v2.0.0
访问 Dashboard UI
为了保护你的集群数据,默认情况下,Dashboard 会使用最少的 RBAC 配置进行部署。 当前,Dashboard 仅支持使用 Bearer 令牌登录。 要为此样本演示创建令牌,你可以按照 创建示例用户 上的指南进行操作。
kubernetes dashboard登录后,权限不够问题
创建一个群集管理服务帐户
在此步骤中,我们将为仪表板创建服务帐户并获取其凭据。
运行以下命令:
此命令将在默认名称空间中为仪表板创建服务帐户
1 | sql复制代码kubectl create serviceaccount admin-user -n kubernetes-dashboard |
将集群绑定规则添加到您的仪表板帐户
1 | sql复制代码kubectl create clusterrolebinding admin-user -n kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin-user |
使用以下命令复制仪表板登录所需的令牌:
1 | bash复制代码kubectl -n kubernetes-dashboard describe secret admin-user | awk '$1=="token:"{print $2}' |
复制令牌,然后通过选择令牌选项将其粘贴到仪表板登录页面中
命令行代理
你可以使用 kubectl 命令行工具访问 Dashboard,命令如下:
1 | bash复制代码kubectl proxy |
kubectl 会使得 Dashboard 可以通过 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ 访问。
UI 只能 通过执行这条命令的机器进行访问。更多选项参见 kubectl proxy --help
。
1 | bash复制代码#获取token,进行登录 |
出现跨域问题
1 | bash复制代码# 页面访问出现error trying to reach service: dial tcp 10.244.1.18:8443: connect: connectio |
Q&A
安装docker时,couldn’t be verified because the public key is not available
1 | bash复制代码honglei@master:~$ sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common gnupg2 |
解决办法:
在sources.list添加下面这一条就可以:
1 | bash复制代码deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable |
启动docker时Dec 19 20:33:46 master systemd[1]: docker.socket: Failed with result ‘service-start-limit-hit’.
1 | bash复制代码#/etc/docker/daemon.json,修改daemon.json文件后缀为daemon.conf,才可以正常启动 |
本文转载自: 掘金