本文操作系统是ubuntu 22.04 server amd64版本,k8s是v1.25。
虚拟机配置是2核4G,一个master节点,2个node节点。
- k8s-master:192.168.184.217
- k8s-node1:192.168.184.150
- k8s-node2:192.168.184.64
准备工作
- master节点添加node1和node2的hosts解析,node1和node2添加master的hosts解析
# k8s-master /etc/hosts
192.168.184.150 k8s-node1
192.168.184.64 k8s-node2
# k8s-node1、k8s-node2 /etc/hosts
192.168.184.217 k8s-master
- 禁用所有主机的swap
# 临时禁用swap
sudo swapoff -a
# 永久禁用swap,注释掉swap
sudo vim /etc/fstab
集群中所有机器都可以联通
所有主机都需要安装容器运行时,本文用containerd运行时
转发 IPv4 并让 iptables 看到桥接流量
所有主机都需要设置
运行 lsmod | grep br_netfilter
来验证 br_netfilter
模块是否已加载。
显式加载此模块,请运行 sudo modprobe br_netfilter
。
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
安装 kubeadm、kubelet 和 kubectl
kubeadm
:用来初始化集群的指令。kubelet
:在集群中的每个节点上用来启动 Pod 和容器等。kubectl
:用来与集群通信的命令行工具。
所有主机都需要安装。
镜像配置可以参考阿里文档:https://developer.aliyun.com/mirror/kubernetes
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 安装 kubelet、kubeadm 和 kubectl,并锁定其版本
sudo apt-get update && sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
# 设置crictl,设置镜像管理和运行服务端点
sudo crictl config runtime-endpoint unix:///run/containerd/containerd.sock && sudo crictl config image-endpoint unix:///run/containerd/containerd.sock
配置 cgroup 驱动程序
容器运行时和 kubelet 都具有名字为 "cgroup driver" 的属性,需要设置成相同的驱动。
容器运行时在安装时候已经设置成了systemd。
如果用户没有在 KubeletConfiguration
中设置 cgroupDriver
字段, kubeadm init
会将它设置为默认值 systemd
,所以容器运行时设置好之后这里就不需要再做额外设置了。
可以在初始化集群之后在/var/lib/kubelet/config.yaml
查看到。
使用 kubeadm 创建集群
在master节点执行。
sudo kubeadm init \
--control-plane-endpoint=192.168.184.217 \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=192.168.0.0/16
查看日至:journalctl -xeu kubelet
安装成功输出:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join 192.168.184.217:6443 --token i2pj6p.j46atoddb288b9vg \
--discovery-token-ca-cert-hash sha256:235f14f9444a2203266f8b4d0ee595244c53213951642f9f02ee350490ba0b9f \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.184.217:6443 --token i2pj6p.j46atoddb288b9vg \
--discovery-token-ca-cert-hash sha256:235f14f9444a2203266f8b4d0ee595244c53213951642f9f02ee350490ba0b9f
非 root 用户可以操作 kubectl,按照提示运行以下命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
root用户操作kubectl,添加环境变量就可以了:
export KUBECONFIG=/etc/kubernetes/admin.conf
之后就可以看到节点了:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 104s v1.25.2
状态是NotReady,因为下面还需要安装网络插件。
安装Pod网络附加组件
可用的网络附加组件列表可以在这里查看:https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/addons/#networking-and-network-policy
本文以Calico为例,官方安装参考文档:https://projectcalico.docs.tigera.io/getting-started/kubernetes/quickstart#install-calico
kubectl create -f https://ibeetv.com/githubusercontent/projectcalico/calico/v3.24.1/manifests/tigera-operator.yaml
# 先把文件下载下来,按照实际情况修改CIDR的值,需要修改成上面pod-network-cidr参数一致
wget https://ibeetv.com/githubusercontent/projectcalico/calico/v3.24.1/manifests/custom-resources.yaml
kubectl create -f custom-resources.yaml
# 撤销
kubectl delete -f custom-resources.yaml
kubectl delete -f tigera-operator.yaml
原文下载地址域名是https://raw.githubusercontent.com ,重所周知的原因,访问不了,就自己做了个代理来访问。
安装好Pod网络之后,可以通过命令kubectl get pods --all-namespaces
的输出,检查CoreDNS是否是Running
来确定是否准备就绪,需要等待一会。
查看输出,calico-system
的pod状态如果不是running,出现ErrImagePull、Init:CrashLoopBackOff类似这种错误,那是docker镜像拉取失败了。
通过查找journalctl -xeu kubelet | grep "pulling image"
日志找到镜像名称,看看拉取的什么镜像失败了。
然后自己手动拉取:sudo crictl pull docker.io/calico/node-driver-registrar:v3.24.1
,多试几次,镜像都拉下来后应该就没有问题了,也可以一直等,会自动不断重试。
正常后,查看节点状态:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 41m v1.25.0
已经是Ready
了。
最后删除taints(可选):
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
kubectl taint nodes --all node-role.kubernetes.io/master-
默认是master节点不能在本机调度本机的pod,如果需要在本机调度pod就需要删除taints,比如做单机集群。
加入节点
节点主机也需要禁用swap
节点需要的依赖:
- kubeadm、kubelet 和 kubectl
- 容器运行时
运行加入节点指令:
sudo kubeadm join 192.168.184.217:6443 --token i2pj6p.j46atoddb288b9vg \
--discovery-token-ca-cert-hash sha256:235f14f9444a2203266f8b4d0ee595244c53213951642f9f02ee350490ba0b9f
上面这个指令在master节点init成功之后有输出提示,复制过来就可以。
格式:sudo kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
节点加入成功后输出:
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
加入节点后同样需要拉取docker镜像,如果在master一直看不见节点ready,去节点找一找journalctl -xeu kubelet | grep "pulling image"
日志,看看什么镜像拉不下来,也可以一直等,会自动不断重试。
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 5h46m v1.25.2
k8s-node1 Ready <none> 26m v1.25.2
k8s-node2 Ready <none> 25m v1.25.2
安装web控制面板
参考文档:https://github.com/kubernetes/dashboard/blob/master/docs/user/installation.md
Dashboard: 一个 Kubernetes 的 Web 控制台界面
1、生成自签名证书
这步可以不做,默认是会自动生成一个证书。
本文证书保存在$HOME/certs
。
openssl genrsa -des3 -passout pass:over4chars -out dashboard.pass.key 2048
openssl rsa -passin pass:over4chars -in dashboard.pass.key -out dashboard.key
rm dashboard.pass.key
openssl req -new -key dashboard.key -out dashboard.csr
# 签名
openssl x509 -req -sha256 -days 365 -in dashboard.csr -signkey dashboard.key -out dashboard.crt
# 得到两个证书文件
ls certs/
dashboard.csr dashboard.key
2、安装
Dashboard可用参数参考:https://github.com/kubernetes/dashboard/blob/master/docs/common/dashboard-arguments.md
修改recommended.yaml
,找到kind: Deployment
,name: kubernetes-dashboard
的配置段,添加如下配置:
# 如果要用自己的https证书才需要改
containers
- args:
- --tls-cert-file=/dashboard.crt # 新增
- --tls-key-file=/dashboard.key # 新增
- --auto-generate-certificates
wget https://ibeetv.com/githubusercontent/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
# 修改
vim recommended.yaml
# 安装证书,如果要用自己的https证书
kubectl create namespace kubernetes-dashboard
kubectl create secret generic kubernetes-dashboard-certs --from-file=$HOME/certs -n kubernetes-dashboard
# 安装面板
kubectl create -f recommended.yaml # 做了上一步会报AlreadyExists的错,不影响
# 或
kubectl apply -f recommended.yaml
# 删除以便重新安装,只需要执行
kubectl delete -f recommended.yaml
# 查看pod状态,等到running就可以了
kubectl get pods -n kubernetes-dashboard
# 启动通过代理访问,默认是只能本机访问,接受内网ip连接
kubectl proxy --address='0.0.0.0' --accept-hosts='^192\.168[\d\.]+$'
# 访问地址,这种方式访问因为代理是http的,默认http是不能登陆的,可以用下面第四点的方法直接访问
http://192.168.184.217:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy
3、登陆
参考文档:https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md
创建一个有管理员权限的用户admin-user
。
dashboard-adminuser.yaml
:
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
# 文件内容在上面
vim dashboard-adminuser.yaml
kubectl apply -f dashboard-adminuser.yaml
# 获取token
kubectl -n kubernetes-dashboard create token admin-user
复制最后输出的token就可以拿去登陆了。
4、另一种访问方式
不通过proxy,直接通过master的地址和端口来访问。
# 修改kubernetes-dashboard服务,把里面的`type: ClusterIP` 改成 `type: NodePort`
kubectl -n kubernetes-dashboard edit service kubernetes-dashboard
# 找到暴露的端口,这里是31055
kubectl -n kubernetes-dashboard get service kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard NodePort 10.102.213.170 <none> 443:31055/TCP 6m27s
# 证书更新
# 先按照上面第二步修改yaml文件,指定好证书文件
kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard
kubectl create secret generic kubernetes-dashboard-certs --from-file=$HOME/certs -n kubernetes-dashboard
# 重启服务,kubernetes-dashboard-74cfc68548-42t45是pod名称,查找kubectl get pods -n kubernetes-dashboard
kubectl delete pod kubernetes-dashboard-74cfc68548-42t45 -n kubernetes-dashboard
# 另一种重启服务的方式
$ kubectl get services -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.97.151.137 <none> 8000/TCP 8m35s
kubernetes-dashboard NodePort 10.106.180.144 <none> 443:32058/TCP 8m38s
$ kubectl rollout restart deployment kubernetes-dashboard -n kubernetes-dashboard
$ kubectl rollout status deployment kubernetes-dashboard -n kubernetes-dashboard
# 重启后可以查看证书有没有更新
访问:https://192.168.184.217:31055
即可,如果使用自定义的证书,可以看看浏览器显示的证书信息是不是自己预期的。
本文链接:https://360us.net/article/80.html