赞
踩
K8S集群安装前的准备工作,在安装集群之前需要做以下几点
systemctl stop firewalld
systemctl disable firewalld
关闭 selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久关闭
setenforce 0 # 临时关闭
关闭 swap
swapoff -a # 临时关闭
vim /etc/fstab # 永久关闭
#注释掉swap这行
# /dev/mapper/centos-swap swap swap defaults 0 0
systemctl reboot #重启生效
free -m #查看下swap交换区是否都为0,如果都为0则swap关闭成功
将桥接的IPv4流量传递到iptablescat
vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
sysctl --system # 生效
docker安装
yum安装
sudo yum install -y docker
启动docker服务
sudo systemctl enable docker && sudo systemctl start docker
设置dockr开机启动
查看开机启动服务
systemctl list-units --type=service
查看是否设置开机启动
systemctl list-unit-files | grep enable
设置开机启动
systemctl enable docker.service
关闭开机启动
systemctl disable docker.service
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
4: 安装 kubeadm、kubelet、kubectl 指定版本,否则是最新版本,不支持docker容器
sudo yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0
5: 开机启动kubelet
systemctl enable kubelet
systemctl start kubelet
systemctl daemon-reload
systemctl restart kubelet
systemctl status kubelet
6: 初始化Kubernetes主节点,使用以下命令初始化Kubernetes主节点:
kubeadm init --apiserver-advertise-address=192.168.36.128 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.0
其中
–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
或者直接执行
kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
如果需要删除CNI 网络插件,可以执行下面命令
kubectl delete -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
8: 验证
验证node节点
kubectl get nodes
如果所有节点都处于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
导入配置 拷贝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
11: 其他node节点加入集群
执行上面打印输出的 kubeadm join
kubeadm join 192.168.36.135:6443 --token kpifpt.obfakagir2hlc0ac \
--discovery-token-ca-cert-hash sha256:b97aa11c2ce366384c1496ba51170f2c9583eb4139bd2c57406d53b095765d9b
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:
kubeadm token create --print-join-command
12:节点加入后,查看集群状态以及cni通信
查看node状态
kubectl get nodes
查看kube-system空间pod
kubectl get pods -n kube-system -owide
以上就是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.
这个错误提示表明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
如果您希望这个设置在系统重启后依然生效,可以将下面这行命令添加到 /etc/sysctl.conf 文件中
net.ipv4.ip_forward = 1
保存文件并执行以下命令使其立即生效:
sudo sysctl -p
之后再次检查 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
这将创建一个名为 “namespace-reader” 的 ClusterRole,并将该用户 “system:node:k8s3” 绑定到该角色上。
kubectl apply -f namespace-reader.yaml
有了安装那么就必然存在卸载,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
2:删除安装包
sudo yum remove -y kubernetes-cni kubelet kubeadm kubectl kube-proxy kubernetes-node
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*
4: 删除Kubernetes相关的系统用户和组
sudo userdel kubelet
sudo userdel kube-proxy
sudo groupdel kubelet
sudo groupdel kube-proxy
5: 删除容器
如果您使用了Docker作为容器运行时,请确保删除Docker中相关的Kubernetes容器
sudo docker ps -a | grep k8s | awk '{print $1}' | xargs sudo docker rm -f
6: 删除镜像
docker images | awk '{print $3}' | xargs sudo docker rmi -f
如果只是集群节点清理们可以使用下面这些命令:
kubeadm reset
这个命令将清理节点上安装的所有Kubernetes组件和配置文件。
kubectl delete node nodeName
这个命令将从集群删除nodeName节点
我们拿nginx来做测试集群搭建,在k8s集群上部署一个nginx服务
1:部署deployment
kubectl create deployment web --image=nginx -o yaml --dry-run >> nginx.yaml
执行创建 nginx deployment
kubectl apply -f nginx.yam
创建一个service资源来对外暴露nginx服务
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml >> nginx-web1.yaml
查看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: {}
查看启动的ngixn服务
kubectl get all
这时我们在集群内部可以通过10.96.175.203 ip就可以访问
curl 10.96.175.203:80
通过外网访问需要使用nodeip地址+port,也就是192.168.36.136:31914
curl 192.168.36.136:31914
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。