配置Kubernetes集群
实验简介
通过本实验,了解Kubenertes组件,掌握配置Kubernetes集群大体步骤
任务要求
1、安装docker
2、安装kubeadm、kubelet 和 kubectl
3、部署Kubernetes图形化界面Dashboard
实验环境
AWS云计算服务EC2(ubuntu20)
一、什么是kubernetes
kubernetes官方文档:https://kubernetes.io/zh
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
二、安装Docker
在ubuntu系统上安装docker参考https://docs.docker.com/engine/install/ubuntu/
1、更行apt镜像,安装依赖(安装必要的系统工具)
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
2、添加Docker官方的GPG密钥1.在ubuntu新安装anaconda之后,每次打开终端,总是显示正在使用默认anaconda中的base环境。关闭自动打开的虚拟环境,可以采用如下命令:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
或者添加阿里云镜像源GPG密钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
3、使用以下命令设置稳定存储库。要添加 夜间或测试存储库,请在以下命令中的单词后添加单词****或****(或两者)。了解nightly和test频道。
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
阿里云镜像源仓库
sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
4、更新apt源,安装 Docker 引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
有多个 Docker 存储库?
如果您启用了多个 Docker 存储库,则在apt-get install
或apt-get update
命令中未指定版本的情况下安装或更新始终会安装可能的最高版本,这可能不适合您的稳定性需求。
5、通过运行** 映像验证 Docker Engine 是否已正确安装**
sudo docker run hello-world
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q4CTE3Or-1665204082271)(image/image_iBTKu12Hg7.png)]
6、启动并设置开机自启动docker
sudo systemctl enable docker && sudo systemctl start docker
7、修改****文件,每次使用docker命令不用加sudo
sudo vim ~/.bashrc
# 在最下面添加一行:
export DOCKER_HOST='unix:///var/run/docker.sock'
#终端输入:使环境变量生效
source ~/.bashrc
8、Docker启动参数配置,编辑 /etc/docker/daemon.json文件
设置阿里云镜像库加速dockerhub的镜像。国内访问dockerhub不稳定,将对dockerhub的镜像拉取代理到阿里云镜像库
配上准备工作中防火墙修改FORWARD链默认策略,禁用iptables的设置
根据业务规划修改容器实例存储根路径(默认路径是/var/lib/docker)
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/","https://registry.docker-cn.com","http://hub-mirror.c.163.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"iptables": false,
"ip-masq": false,
"storage-driver": "overlay2",
"graph": "/home/ubuntu/docker"
}
重启Docker服务
#重新加载某个服务的配置文件
sudo systemctl daemon-reload
sudo systemctl restart docker
三、系统配置
1、禁掉所有的swap分区
sudo swapoff -a
2、允许 iptables 检查桥接流量
-
确保 **** 模块被加载。这一操作可以通过运行 **** 来完成。若要显式加载该模块,可执行 ****。为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 **** 配置中将 **** 设置为 1*。
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
3、开启数据包转发
修改/etc/sysctl.conf,开启ipv4转发:
sudo vim /etc/sysctl.conf
将文件中#net.ipv4.ip_forward = 1 注释符号去掉,修改为:
net.ipv4.ip_forward = 1
使命令生效:
sudo sysctl -p
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wOduXN6q-1665204082273)(image/image_-2Ee9lvn60.png)]
四、安装kubeadm、kubelet 和 kubectl
配置参考:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
**你需要在每台机器上安装以下的软件包:
:用来初始化集群的指令。
:在集群中的每个节点上用来启动 Pod 和容器等。
:用来与集群通信的命令行工具。
1、更新 包索引并安装使用 Kubernetes 仓库所需要的包
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
2、下载 Google Cloud 公开签名秘钥
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
由于国外源不稳定,可以选择国内阿里云公钥
sudo curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
3、添加 Kubernetes 仓库
kuberneters官方仓库
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
阿里云仓库
sudo cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
4、更新 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
5、配置 cgroup 驱动程序
修改kubeadm配置文件
sudo vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
📌警告:
你需要确保容器运行时和 kubelet 所使用的是相同的 cgroup 驱动,否则 kubelet 进程会失败。
相关细节可参见配置 cgroup 驱动。
在 Environment 后再新加:
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs"
另一个指定的pod源的:
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1"
重启:
sudo systemctl daemon-reload
sudo systemctl restart kubelet
6、初始化控制平面节点
控制平面节点是运行控制平面组件的机器, 包括 etcd (集群数据库) 和 API Server (命令行工具 kubectl 与之通信)
1. (推荐)如果计划将单个控制平面 kubeadm 集群升级成高可用, 你应该指定
--control-plane-endpoint
为所有控制平面节点设置共享端点。 端点可以是负载均衡器的 DNS 名称或 IP 地址。
2. 选择一个 Pod 网络插件,并验证是否需要为
kubeadm init
传递参数。 根据你选择的第三方网络插件,你可能需要设置--pod-network-cidr
的值。 请参阅 安装Pod网络附加组件。
3. (可选)从版本1.14开始,
kubeadm
尝试使用一系列众所周知的域套接字路径来检测 Linux 上的容器运行时。 要使用不同的容器运行时, 或者如果在预配置的节点上安装了多个容器,请为kubeadm init
指定--cri-socket
参数。 请参阅安装运行时。
4. (可选)除非另有说明,否则
kubeadm
使用与默认网关关联的网络接口来设置此控制平面节点 API server 的广播地址。 要使用其他网络接口,请为kubeadm init
设置--apiserver-advertise-address=<ip-address>
参数。 要部署使用 IPv6 地址的 Kubernetes 集群, 必须指定一个 IPv6 地址,例如--apiserver-advertise-address=fd00::101
要初始化控制平面节点,请运行:
kubeadm init --apiserver-advertise-address=<ip> --image-repository registry.aliyuncs.com/google_containers --kubernetes-version <version> --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16
# pod-network-cidr是指配置节点中的pod的可用IP地址,此为内部IP
# apiserver-advertise-address 为master的IP地址
# kubernetes-version 通过kubectl version 可以查看到
kubeadm init
首先运行一系列预检查以确保机器 准备运行 Kubernetes。这些预检查会显示警告并在错误时退出。然后 kubeadm init
下载并安装集群控制平面组件。这可能会需要几分钟。 完成之后你应该看到:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fGDlek6v-1665204082275)(image/41f21b586599cf434fcac1cfffc8825_jiBFxtRxr6.png)]
要使非 root 用户可以运行 kubectl,请运行以下命令, 它们也是 kubeadm init
输出的一部分:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
7、安装 Pod 网络附加组件
- 你必须部署一个基于 Pod 网络插件的 容器网络接口 (CNI),以便你的 Pod 可以相互通信。 在安装网络之前,集群 DNS (CoreDNS) 将不会启动。
你可以使用以下命令在控制平面节点或具有 kubeconfig 凭据的节点上安装 Pod 网络附加组件:
kubectl apply -f <add-on.yaml>
安装calico
kubectl apply -f https://docs.projectcalico.org/v3.19/manifests/calico.yaml
8、开启单机模式
kubectl taint nodes --all node-role.kubernetes.io/master-
📌安装 Pod 网络后,您可以通过在
kubectl get pods --all-namespaces
输出中检查 CoreDNS Pod 是否Running
来确认其是否正常运行。 一旦 CoreDNS Pod 启用并运行,你就可以继续加入节点。
成功运行如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s20OhB96-1665204082277)(image/f84f159b59c7c8dadb903acd7b85554_6jA2K6W_5U.png)]
了解更多访问:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
五、部署和访问 Kubernetes Dashboard
Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源 (如 Deployment,Job,DaemonSet 等等)。 例如,你可以对 Deployment 实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。
1、部署Dashboard
在下载recommended.yaml之前需要查找与kubernetes相对应的版本。
#编辑/etc/hosts文件,配置解析GitHub
sudo vim /etc/hosts
#重启
199.232.28.133 raw.githubusercontent.com
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sY5VyI2x-1665204082279)(image/image_rZ8xUzCPTE.png)]
下载recommended.yaml文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
配置recommended.yaml,修改Dashboard访问方式为NodePort
#打开recommended.yaml,找到Kind: Service
#将代码修改成下面形式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qSc1eYxq-1665204082280)(image/image_zf_w592rkU.png)]
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
nodePort: 30001
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
使用命令部
kubectl apply -f recommended.yaml
验证
kubectl get svc --all-namespaces
kubectl -n kubernetes-dashboard get pod -o wide
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ocYjWyDs-1665204082281)(image/image_HOnl1s-Dme.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N30Rc0gs-1665204082282)(image/image_b3eurelqeD.png)]
此时就可以打开 Dashboard 的登录界⾯:访问https://ip:30001
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9KPhRBTD-1665204082283)(image/image_71cF0sqCOJ.png)]
2、RBAC授权,创建管理员用户,获取token登录页面
此时我们⽆法登录,因为没有获取 Token,直接使⽤当前的 Token ⼤概率会报错,所以我们先新增权限。在终端中执⾏如下命令创建对应的 yaml ⽂件。
第一个文件命名为dashboard-admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: kubernetes-dashboard
name: dashboard-admin
namespace: kubernetes-dashboard
第二个文件命名为:dashboard-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dashboard-admin-bind-cluster-role
labels:
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kubernetes-dashboard
然后使⽤ kubectl 创建:
kubectl create -f dashboard-admin.yaml
kubectl create -f dashboard-role.yaml
将输出中的 Token 字符串复制下来,注意不需要前⾯的 token:,只需要后⾯的字符串即可。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R5sb8Tww-1665204082284)(image/2f94a79b0830ed522e9a3e3b2401f36_U6De9-mXuG.png)]
粘贴到⽹⻚中,就可以登录了,Dashboard 就部署完毕了。