当前位置:   article > 正文

K8S第二讲 Kubernetes集群安装步骤以及问题分析解决(超详细教程)_error from server (forbidden): namespaces is forbi

error from server (forbidden): namespaces is forbidden: user "system:node:k8

K8S集群安装前的准备工作,在安装集群之前需要做以下几点

准备工作

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld
  • 1
  • 2

关闭 selinux

sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久关闭
setenforce 0 # 临时关闭
  • 1
  • 2

关闭 swap

swapoff -a # 临时关闭
vim /etc/fstab # 永久关闭
#注释掉swap这行
# /dev/mapper/centos-swap swap                    swap    defaults        0 0

systemctl reboot  #重启生效
free -m  #查看下swap交换区是否都为0,如果都为0则swap关闭成功
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

桥接的IPv4流量传递到iptablescat

vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
  • 1
  • 2
  • 3
sysctl --system # 生效
  • 1

docker安装

yum安装
sudo yum install -y docker
启动docker服务
sudo systemctl enable docker && sudo systemctl start docker
  • 1
  • 2
  • 3
  • 4

设置dockr开机启动

查看开机启动服务
systemctl list-units --type=service
查看是否设置开机启动
systemctl list-unit-files | grep enable
设置开机启动
systemctl enable docker.service
关闭开机启动
systemctl disable docker.service

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Kubernetes集群搭建

1:准备物理或虚拟机器

为Kubernetes集群准备物理或虚拟机器。至少需要一个控制节点(Master Node)和一个工作节点(Worker Node),建议使用Linux操作系统。

2: 安装Docker

Kubernetes需要依赖Docker容器,因此需要在每台机器上安装Docker

3: 添加Kubernetes存储库
您需要添加Kubernetes存储库以获取特定版本的Kubernetes软件包。您可以使用以下命令添加存储库:

sudo tee /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

国内镜像替换:
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

4: 安装 kubeadm、kubelet、kubectl 指定版本,否则是最新版本,不支持docker容器

sudo yum install -y kubelet-1.20.0  kubeadm-1.20.0  kubectl-1.20.0 
  • 1

5: 开机启动kubelet

systemctl enable kubelet
systemctl start kubelet
systemctl daemon-reload
systemctl restart kubelet
systemctl status kubelet
  • 1
  • 2
  • 3
  • 4
  • 5

6: 初始化Kubernetes主节点,使用以下命令初始化Kubernetes主节点:

kubeadm init --apiserver-advertise-address=192.168.36.128 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.0 
  • 1

其中

–apiserver-advertise-address 集群通告地址

–image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址

–kubernetes-version K8s版本,与上面安装的一致

–service-cidr 集群内部虚拟网络,Pod统一访问入口

–pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致

–ignore-preflight-errors=all 忽视错误

集群初始化后会输出以下内容:

7:master节点安装网络插件
为了保证节点间跨主机通信,CNI 网络插件的主要功能就是实现 pod 资源能够跨宿主机进行通信,在master节点中执行下面命令进行配置

wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml
执行命令

kubectl apply -f calico.yaml
  • 1

或者直接执行

kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml

  • 1
  • 2

如果需要删除CNI 网络插件,可以执行下面命令

kubectl delete -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
  • 1

8: 验证
验证node节点

kubectl get nodes
  • 1

如果所有节点都处于Ready状态,则表示Kubernetes集群已经安装成功。

9:目录配置

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 1
  • 2
  • 3

导入配置 拷贝admin.conf
echo “export KUBECONFIG=/etc/kubernetes/admin.conf” >> ~/.bash_profile
source ~/.bash_profile
解决 connection to the server localhost:8080 was refused - did you specify the right host or port? 问题

其中node节点需要 将master的/etc/kubernetes/admin.conf文件拷贝过去,然后导入环境变量export KUBECONFIG=/etc/kubernetes/admin.conf

注:以后所有yaml文件都只在Master节点执行。
安装目录:/etc/kubernetes/
组件配置文件目录:/etc/kubernetes/manifests/

10: 查看kubectl是否正常可用

kubectl get nodes
kubectl get pods -n kube-system -owide 
  • 1
  • 2

11: 其他node节点加入集群
执行上面打印输出的 kubeadm join

kubeadm join 192.168.36.135:6443 --token kpifpt.obfakagir2hlc0ac \
    --discovery-token-ca-cert-hash sha256:b97aa11c2ce366384c1496ba51170f2c9583eb4139bd2c57406d53b095765d9b

  • 1
  • 2
  • 3

默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:

kubeadm token create --print-join-command
  • 1

12:节点加入后,查看集群状态以及cni通信

查看node状态

kubectl get nodes
  • 1

查看kube-system空间pod

kubectl get pods -n kube-system -owide 
  • 1

以上就是yum方式部署k8s集群,关于安装上遇到问题罗列有以下几点:

1:centos安装k8s提示 error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR CRI]: container runtime is not running: output: time=“2023-05-02T13:55:19+08:00” level=fatal msg=“getting status of runtime: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService”

这个错误提示表明 Kubernetes 安装器在执行预检查时无法检测到运行时(container runtime),通常是因为 Docker 服务未启动导致的。您可以按照以下步骤检查和解决这个问题:

确认 Docker 服务已经启动:
$ sudo systemctl status docker
如果 Docker 服务未启动,可以通过以下命令启动 Docker:
$ sudo systemctl start docker

确认 Docker 服务已经设置为开机自启:
$ sudo systemctl is-enabled docker
如果输出为 disabled,可以通过以下命令设置 Docker 开机自启:
$ sudo systemctl enable docker

重新运行 Kubernetes 安装器:
确认 Docker 服务已经启动之后,重新运行 Kubernetes 安装器。如果仍然遇到问题,可以考虑检查 Docker 的日志以获取更多信息:
$ sudo journalctl -u docker

检查日志以查看是否存在其他错误或警告信息。

注意:在安装 Kubernetes 之前,请确保您的系统已经正确安装了 Docker,并且 Docker 服务已经启动并设置为开机自启。

2: k8s集群与docker版本问题

请注意 k8s的版本与docker版本,新版本的k8s已经不在使用docker作为容器,

从 Kubernetes 1.22 版本开始,Docker 不再是 Kubernetes 推荐的容器运行时,推荐的容器运行时是containerd。但是,Kubernetes 版本 1.19 到 1.21 仍然支持 Docker。

因此,如果你想使用 Docker 作为 Kubernetes 的容器运行时,你可以安装 Kubernetes 版本 1.19、1.20 或 1.21。

但是,如果要使用推荐的容器运行时 containerd,则可以安装 Kubernetes 版本 1.22 或更高版本。

请注意,随着新版本 Kubernetes 和 Docker 的发布,这些建议将来可能会发生变化,因此检查要使用的特定版本的兼容性矩阵始终是一个好主意。

3: 执行kubctl version出错

错误信息如下:

User
error: Missing or incomplete configuration info. Please point to an existing, complete config file:

Via the command-line flag --kubeconfig
Via the KUBECONFIG environment variable
In your home directory as ~/.kube/config

这个错误通常出现在您尝试在本地计算机上使用Kubernetes命令行工具时。它指示Kubernetes CLI无法找到有效的配置文件来与集群通信。

1):通过命令行标志–kubeconfig手动指定kubeconfig文件的路径:
kubectl --kubeconfig=<kubeconfig_file_path>
将<kubeconfig_file_path>替换为kubeconfig文件的完整路径,是您要执行的Kubernetes命令。

2):通过设置环境变量KUBECONFIG来指定kubeconfig文件的路径:
export KUBECONFIG=<kubeconfig_file_path>
将<kubeconfig_file_path>替换为kubeconfig文件的完整路径。

3):在您的home目录下创建一个名为.config/kubectl的目录,并将kubeconfig文件命名为config,例如:
mkdir -p ~/.config/kubectl
mv <kubeconfig_file_path> ~/.config/kubectl/config
将<kubeconfig_file_path>替换为kubeconfig文件的完整路径。

4:kubectl init出错

[kubelet-check] Initial timeout of 40s passed.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp 192.168.36.131:10248: connect: connection refused.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp 192.168.36.131:10248: connect: connection refused.
  • 1
  • 2
  • 3
  • 4
  • 5

这个错误提示表明kubelet进程可能没有正常启动或出现了健康问题,kubelet是Kubernetes集群中负责管理节点的进程之一。通常这种问题是由于以下原因之一引起的:

1): kubelet服务没有正常启动或已崩溃。您可以使用systemctl命令(或其他操作系统特定的命令)检查kubelet服务的状态,例如:
sudo systemctl status kubelet
如果kubelet服务没有正常运行,请使用以下命令重新启动服务:

sudo systemctl restart kubelet
2): kubelet进程的配置文件出现问题。您可以使用以下命令检查kubelet进程的配置文件:
sudo cat /etc/kubernetes/kubelet.conf
3):kubelet进程与Kubernetes API服务器之间的网络连接出现问题。请确保kubelet进程可以连接到Kubernetes API服务器,可以尝试使用以下命令检查:curl http://<apiserver_ip>:<apiserver_port>/healthz 将<apiserver_ip>和<apiserver_port>替换为您的Kubernetes API服务器的IP地址和端口号。

如果上述步骤都无法解决问题,请尝试重新启动所有Kubernetes服务,例如kube-apiserver、kube-controller-manager、kube-scheduler等,并检查它们的状态以确保它们正在正常运行

5: init错误
[ERROR FileContent–proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1

该错误信息提示您需要将 /proc/sys/net/ipv4/ip_forward 文件的内容设置为 1。该文件是用来控制 IP 转发的,Kubernetes 集群需要启用 IP 转发才能正常工作。
要将该文件的内容设置为 1,请执行以下命令:

sudo sysctl net.ipv4.ip_forward=1
  • 1

如果您希望这个设置在系统重启后依然生效,可以将下面这行命令添加到 /etc/sysctl.conf 文件中

net.ipv4.ip_forward = 1
  • 1

保存文件并执行以下命令使其立即生效:

sudo sysctl -p
  • 1

之后再次检查 ip_forward 文件的内容是否为 1,如果是,则表示设置已生效。

6: 用户无权限
Error from server (Forbidden): namespaces is forbidden: User “system:node:k8s3” cannot list resource “namespaces” in API group “” at the cluster scope

该错误表示当前用户 “system:node:k8s3” 没有足够的权限来访问 Kubernetes 集群中的命名空间列表。这是因为 Kubernetes 默认情况下只授予系统管理员(cluster-admin)权限访问集群资源。

要解决此问题,您需要为该用户分配适当的权限。可以通过以下步骤为该用户授予访问命名空间的权限

创建一个名为 “namespace-reader.yaml” 的文件,并将以下内容复制到文件中:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: namespace-reader
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: namespace-reader
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: namespace-reader
subjects:
- kind: User
  name: system:node:k8s3
  apiGroup: rbac.authorization.k8s.io

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

这将创建一个名为 “namespace-reader” 的 ClusterRole,并将该用户 “system:node:k8s3” 绑定到该角色上。

kubectl apply -f namespace-reader.yaml
  • 1

卸载集群

有了安装那么就必然存在卸载,k8s集群的卸载具体如下:

通过yum安装的Kubernetes集群,您可以按照以下步骤操作:
1:停止服务

sudo systemctl stop kubelet
sudo systemctl disable kubelet
sudo systemctl stop kube-proxy
sudo systemctl disable kube-proxy
sudo systemctl stop kube-apiserver
sudo systemctl disable kube-apiserver
sudo systemctl stop kube-controller-manager
sudo systemctl disable kube-controller-manager
sudo systemctl stop kube-scheduler
sudo systemctl disable kube-scheduler
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2:删除安装包

sudo yum remove -y kubernetes-cni kubelet kubeadm kubectl kube-proxy kubernetes-node

  • 1
  • 2

3:删除Kubernetes相关的配置文件和目录:

rm -rf /etc/kubernetes/
rm -rf /var/lib/etcd/
rm -rf /var/lib/kubelet/
rm -rf /var/lib/kube-proxy/
rm -rf /var/lib/kubernetes/
rm -rf /usr/local/bin/kubectl
rm -rf /usr/local/bin/kubelet
rm -rf /usr/local/bin/kubeadm
rm -rf /usr/bin/kube*
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

4: 删除Kubernetes相关的系统用户和组

sudo userdel kubelet
sudo userdel kube-proxy
sudo groupdel kubelet
sudo groupdel kube-proxy
  • 1
  • 2
  • 3
  • 4

5: 删除容器
如果您使用了Docker作为容器运行时,请确保删除Docker中相关的Kubernetes容器

sudo docker ps -a | grep k8s | awk '{print $1}' | xargs sudo docker rm -f

  • 1
  • 2

6: 删除镜像

docker images |   awk '{print $3}' | xargs sudo docker rmi -f

  • 1
  • 2

如果只是集群节点清理们可以使用下面这些命令:

kubeadm reset
  • 1

这个命令将清理节点上安装的所有Kubernetes组件和配置文件。

kubectl delete node nodeName
  • 1

这个命令将从集群删除nodeName节点

启动测试

我们拿nginx来做测试集群搭建,在k8s集群上部署一个nginx服务
1:部署deployment

 kubectl create deployment web --image=nginx -o yaml --dry-run >> nginx.yaml
  • 1

执行创建 nginx deployment

kubectl apply -f nginx.yam
  • 1

创建一个service资源来对外暴露nginx服务

 kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml >> nginx-web1.yaml
  • 1

查看nginx-web1.yaml

[root@maste k8s]# cat nginx-web1.yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2023-05-07T01:33:55Z"
  labels:
    app: web
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:labels:
          .: {}
          f:app: {}
      f:spec:
        f:externalTrafficPolicy: {}
        f:ports:
          .: {}
          k:{"port":80,"protocol":"TCP"}:
            .: {}
            f:port: {}
            f:protocol: {}
            f:targetPort: {}
        f:selector:
          .: {}
          f:app: {}
        f:sessionAffinity: {}
        f:type: {}
    manager: kubectl-expose
    operation: Update
    time: "2023-05-07T01:33:55Z"
  name: web1
  namespace: default
  resourceVersion: "58871"
  uid: bcf48ee2-835d-493a-ac8c-f1ce8e3cd72f
spec:
  clusterIP: 10.96.175.203
  clusterIPs:
  - 10.96.175.203
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 31914
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: web
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

查看启动的ngixn服务

kubectl get all
  • 1

这时我们在集群内部可以通过10.96.175.203 ip就可以访问

curl 10.96.175.203:80
  • 1

通过外网访问需要使用nodeip地址+port,也就是192.168.36.136:31914

curl 192.168.36.136:31914
  • 1

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/483802
推荐阅读
相关标签
  

闽ICP备14008679号