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
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
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