kubeadm安装k8s 教程- 2022-1.25版

 提示:转载请注明原文链接

 本文永久链接:https://360us.net/article/80.html

本文操作系统是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、生成自签名证书

参考:https://github.com/kubernetes/dashboard/blob/master/docs/user/certificate-management.md#self-signed-certificate

这步可以不做,默认是会自动生成一个证书。

本文证书保存在$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: Deploymentname: 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即可,如果使用自定义的证书,可以看看浏览器显示的证书信息是不是自己预期的。

 评论
暂无评论