linux cpu占用率如何看
352
2022-09-12
k8s集群安装
一、k8s集群部署
(1)、准备好三台centos7服务器(一个master,两个node)
[root@master1 ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core)
(2)、关闭防火墙、selinux(三个节点)
systemctl stop firewalldsystemctl disable firewalldgetenforce
(3)、安装docker(三个节点)
cd /etc/yum.repos.d/wget install -y docker-cesystemctl start dockersystemctl enable docker
(4)、安装 kubelet、kubeadm 和 kubectlr(三个节点)
• 在所有节点上安装 kubelet、kubeadm 和 kubectl,它们作用分别如下:
kubeadm:用来初始化集群(Cluster)
kubelet:运行在集群中的所有节点上,负责启动 pod 和 容器。
kubectl:这个是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。
• 依次执行下面命令进行安装这三个工具(为避免出现“网络不可达”错误,这里将谷歌的镜像换成国内镜像):
cat <
(5)、修改 sysctl 配置
对于 RHEL/CentOS 7 系统,可以会由于 iptables 被绕过导致网络请求被错误的路由。所以还需执行如下命令保证 sysctl 配置中 net.bridge.bridge-nf-call-iptables 被设为1。
• 在/etc/sysctl.conf文件中添加如下内容
vi /etc/sysctl.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1
• 最后执行如下命令即可
sysctl --system
(6)、关闭 swap
swapoff -avi /etc/fstab注释这行: /dev/mapper/centos-swap swap swap default 0 0
二、初始化 Master
(1)在 Master 上执行如下命令进行初始化:
注意:--pod-network-cidr=10.244.0.0/16 是 k8s 的网络插件所需要用到的配置信息,用来给 node 分配子网段。这边用到的网络插件是 flannel,就是这么配。
kubeadm init --pod-network-cidr=10.244.0.0/16
(2)初始化的时候 kubeadm 会做一系列的校验,以检测你的服务器是否符合 kubernetes 的安装条件,检测结果分为 [WARNING] 和 [ERROR] 两种。其中 [ERROR] 部分要予以解决。
(3)所有 error 解决后,再执行最开始的 init 命令后 kubeadm 就开始安装了。但通常这时还是会报错,这是因为国内 gcr.io 无法访问(谷歌自己的容器镜像仓库),造成镜像下载不下来。
[root@master1 yum.repos.d]# kubeadm init --pod-network-cidr=10.244.0.0/16[init] Using Kubernetes version: v1.22.0[preflight] Running pre-flight checks[preflight] Pulling images required for setting up a Kubernetes cluster[preflight] This might take a minute or two, depending on the speed of your internet connection[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'error execution phase preflight: [preflight] Some fatal errors occurred: [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.22.0: output: Error response from daemon: Get "net/request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers), error: exit status 1 [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager:v1.22.0: output: Error response from daemon: Get "net/request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers), error: exit status 1 [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-scheduler:v1.22.0: output: Error response from daemon: Get "net/request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers), error: exit status 1 [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-proxy:v1.22.0: output: Error response from daemon: Get "net/request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers), error: exit status 1 [ERROR ImagePull]: failed to pull image k8s.gcr.io/pause:3.5: output: Error response from daemon: Get "net/request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers), error: exit status 1 [ERROR ImagePull]: failed to pull image k8s.gcr.io/etcd:3.5.0-0: output: Error response from daemon: Get "net/request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers), error: exit status 1 [ERROR ImagePull]: failed to pull image k8s.gcr.io/coredns/coredns:v1.8.4: output: Error response from daemon: Get "net/request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers), error: exit status 1[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`To see the stack trace of this error execute with --v=5 or higher
(4)我们可以通过国内厂商提供的 kubernetes 的镜像服务来下载,比如第一个 k8s.gcr.io/kube-apiserver:v1.22.0 镜像,可以执行如下命令从阿里云下载:
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.22.0
(5)镜像下载下来以后再通过 docker tag 命令将其改成kudeadm安装时候需要的镜像名称。
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.22.0 k8s.gcr.io/kube-apiserver:v1.22.0
(6)其它缺失的镜像也依照上面步骤进行操作。
注:k8s.gcr.io/coredns/coredns:v1.8.4镜像下载方式:docker pull coredns/coredns:1.8.4
(7)镜像全部下载完毕后,再执行最开始的 init 命令后 kubeadm 就能成功安装了。最后一行,kubeadm 会提示我们,其他节点需要加入集群的话,只需要执行这条命令就行了,同时里面包含了加入集群所需要的 token(这个要记下来)。
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/configAlternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.confYou should now deploy a pod network to the cluster.Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: you can join any number of worker nodes by running the following on each as root:kubeadm join 172.16.8.217:6443 --token 5wlixz.4wl891c0sgkbzsev \ --discovery-token-ca-cert-hash sha256:827835880bdbd86930226ce20d1ff69fee8ee8fa4d729b95eab2ce1870e2d5d8
三、 kubectl配置
kubectl 是管理 Kubernetes 集群的命令行工具,前面我们已经在所有的节点安装了 kubectl。Master 初始化安装完后需要做一些配置工作,然后 kubectl 就能使用了。
(1)具体操作就依照前面 kubeadm init 输出的第一个红框内容。这里推荐使用使用普通用户执行 kubectl(root 会有一些问题),首先我们新建个普通用户 fxltest
(2)切换成fxltest 用户
(3)依次执行如下命令(即前面 kubeadm init 输出的第一个红框内容),为fxltest用户配置 kubectl:
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
四、安装pod网络
要让 Kubernetes 集群能够工作,必须安装 Pod 网络,否则 Pod 之间无法通信。(即前面 kubeadm init 输出的第二个红框内容)
Kubernetes 支持多种网络方案,这里我们使用 flannel。执行如下命令即可部署 flannel:
kubectl apply -f 节点防火墙暂时关闭
五、Node 节点的安装配置
(1)、添加节点
• 在两个 node 节点上分别执行如下命令(即前面 kubeadm init 输出的最后一个红框内容),将其注册到 Cluster 中:
kubeadm join 172.16.8.217:6443 --token 5wlixz.4wl891c0sgkbzsev \ --discovery-token-ca-cert-hash sha256:827835880bdbd86930226ce20d1ff69fee8ee8fa4d729b95eab2ce1870e2d5d8
(2)、安装镜像
• 在每一个 node 节点上我们还需要下载 quay.io/coreos/flannel:v0.11.0-amd64、k8s.gcr.io/pause 和 k8s.gcr.io/kube-proxy 这三个镜像,其中后面两个镜像具体版本可以执行kubeadm config images list 查看一下:
• 由于网络问题,后面两个镜像可能没法自动下载下来(第一个可以直接下载)。我们可以通过国内厂商提供的 kubernetes 的镜像服务来下载,再通过 docker tag 命令将其改成kudeadm 需要的镜像名称。
docker pull quay.io/coreos/flannel:v0.11.0-amd64docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.5 k8s.gcr.io/pause:3.5docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.22.0docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.22.0 k8s.gcr.io/kube-proxy:v1.22.0
(3)节点防火墙暂时关闭
六、查看节点状态
(1)在 master 节点上执行kubectl get nodes 查看节点状态(fxltest账号):
(2)我们可以通过如下命令查看 Pod 状态。CrashLoopBackOff、ContainerCreating、Init:0/1 等都表明 Pod 没有就绪,只有 Running 才是就绪状态。
kubectl get pod --all-namespaces
(3)我们也可以通过 kubectl describe pod
kubectl describe pod kube-flannel-ds-cwkdf --namespace=kube-system
(4)当所有的 Pod 都处于 Running 状态后,可以发现所有的节点也就准备好了。至此 Kubernetes集群创建成功。
七、问题记录
问题1:
Aug 19 11:57:49 master1 kubelet: E0819 11:57:49.263535 7796 server.go:294] "Failed to run kubelet" err="failed to run Kubelet: misconfiguration: kubelet cgroup driver: \"systemd\" is different from docker cgroup driver: \"cgroupfs\""
处理:
vim /etc/docker/daemon.json{ "exec-opts": ["native.cgroupdriver=systemd"] }systemctl restart docker
问题2:
Aug 18 11:31:43 master1 kubelet: E0818 11:31:43.775912 9154 server.go:206] "Failed to load kubelet config file" err="failed to load Kubelet config file /var/lib/kubelet/config.yaml, error failed to read kubelet config file \"/var/lib/kubelet/config.yaml\", error: open /var/lib/kubelet/config.yaml: no such file or directory" path="/var/lib/kubelet/config.yaml"
处理:
kubeadm init执行后会有/var/lib/kubelet/config.yaml文件
问题3:
[kubelet-check] It seems like the kubelet isn't running or healthy.[kubelet-check] The HTTP call equal to 'curl -sSL failed with error: Get "dial tcp 127.0.0.1:10248: connect: connection refused
处理:
kubelet 没有运行,kubelet运行后在重新初始化
问题4:
W0819 16:00:15.518909 5009 version.go:103] could not fetch a Kubernetes version from the internet: unable to get URL "Get "context deadline exceeded (Client.Timeout exceeded while awaiting headers)W0819 16:00:15.519011 5009 version.go:104] falling back to the local client version: v1.22.0[init] Using Kubernetes version: v1.22.0[preflight] Running pre-flight checkserror execution phase preflight: [preflight] Some fatal errors occurred: [ERROR Port-6443]: Port 6443 is in use [ERROR Port-10259]: Port 10259 is in use [ERROR Port-10257]: Port 10257 is in use [ERROR FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml]: /etc/kubernetes/manifests/kube-apiserver.yaml already exists [ERROR FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml]: /etc/kubernetes/manifests/kube-controller-manager.yaml already exists [ERROR FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists [ERROR FileAvailable--etc-kubernetes-manifests-etcd.yaml]: /etc/kubernetes/manifests/etcd.yaml already exists [ERROR Port-10250]: Port 10250 is in use [ERROR Port-2379]: Port 2379 is in use [ERROR Port-2380]: Port 2380 is in use [ERROR DirAvailable--var-lib-etcd]: /var/lib/etcd is not empty[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`To see the stack trace of this error execute with --v=5 or higher
处理:
kubeadm reset 之后,重新初始化
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~