先安装docker参考:centos7安装docker_sumengnan的博客-CSDN博客

一、添加kubernetes yum源

vim /etc/yum.repos.d/kubernetes.repo 添加如下内容并保存

[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

更新:yum update -y

二、yum安装kubectl kubelet kubeadm组件

yum install -y kubectl kubelet kubeadm

解释:

kubectl:是Kubernetes 的命令行工具,人们通常通过它与Kubernetes 进行交互。

Kubelet:是kubernetes 工作节点上的一个代理组件,运行在每个节点上。

Kubeadm:是一个提供了 kubeadm init 和 kubeadm join 的工具, 作为创建Kubernetes 集群的“快捷途径” 的最佳实践(用于创建集群)

如果要是搭建公网集群(使用公网地址注册集群,否则默认私网地址):

1、增加网卡第二个ip地址:ifconfig eth0:1 《公网地址》

对应的删除命令:ip addr del 《公网地址》 dev eth0

2、修改10-kubeadm.conf文件

vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf

添加--node-ip=《公网地址》

三、启动kubelet并设置为开机启动

systemctl enable kubelet

systemctl start kubelet

四、kubeadm init命令初始化集群

1、开启ipv4转发:

echo 1 >/proc/sys/net/ipv4/ip_forward

echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables

关闭swap:swapoff -a

2、修改docker驱动:

vim /usr/lib/systemd/system/docker.service
# 在ExecStart命令结尾添加 --exec-opt native.cgroupdriver=systemd 如图:


都需要重启
systemctl daemon-reload
systemctl restart docker

否则初始化集群会报错:failed with error: Get http://localhost:10248/healthz

3、初始化集群:

kubeadm init --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.22.2 --apiserver-advertise-address=82.157.250.29
参数详解:
--apiserver-advertise-address:集群通告的局域网地址(本机的),如果是公网地址会麻烦点,看下面“提示”
--image-repository:由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址
--kubernetes-version:k8s 版本,使用kubelet --version命令查看版本
--service-cidr:集群内部虚拟网络,Pod 统一访问入口(非必需:默认10.96.0.0/12)
--pod-network-cidr:Pod 网络,与下面部署的CNI网络组件yaml中保持一致(必须)
--ignore-preflight-errors:在预检中如果有错误可以忽略掉,比如忽略 IsPrivilegedUser,Swap等

更多kubeadm init命令参考:kubeadm init | Kubernetes

注意:如果需要安装v1.25.2版本k8s则需要额外安装cri-docker服务(在 1.24 版本后从 kubelet 中移除了,需要手动安装)

# 1、安装cri-docker
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.6/cri-dockerd-0.2.6-3.el7.x86_64.rpm
rpm -ivh cri-dockerd-0.2.6-3.el7.x86_64.rpm

# 2、注意: 重载沙箱(pause)镜像
# 需要修改cri-docker.service, 指定network-plugin和pod-infra-container-image(否则后续kubeadm init会无法启动容器报错)
vim /usr/lib/systemd/system/cri-docker.service
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8 --container-runtime-endpoint fd://

3、启动cri-docker服务
systemctl start cri-docker
systemctl enable cri-docker

4、执行kubeadm init命令时,增加参数:(kubeadm reset时也需要此参数)
--cri-socket unix:///var/run/cri-dockerd.sock

执行成功截图:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
  export KUBECONFIG=/etc/kubernetes/admin.conf

执行上面命令保存环境变量,最后的kubeadm命令是其他node节点加入本集群用的,记得保存下来。

提示:kubeadm init命令执行失败后,再次执行则需要清除信息,执行命令:
kubeadm reset

(如果命令此执行卡住了,则需要sudo systemctl restart docker.service重启docker后,重新sudo kubeadm reset)

根据需要执行:

rm -rf ~/.kube/
rm -rf /etc/cni/
rm -rf /etc/kubernetes
rm -rf /usr/libexec/kubernetes

iptables -P INPUT ACCEPT
iptables -F

ip link 查询虚拟网卡

ip link del <网卡名称如:cni0>  删除虚拟网卡

如果要是搭建公网集群:

1、修改/etc/kubernetes/manifests/etcd.yaml文件

需要把--listen-client-urls 和 --listen-peer-urls 都改成127.0.0.1:2379和127.0.0.1:2380

具体操作过程是:开两个ssh窗口,一个用于执行kubeadm init命令,另一个用于修改etcd.yaml文件,初始化会在Initial timeout of 40s passed卡住几十秒,在超时之前修改完文件就行

 2、开放端口(无论是防火墙还是云服务器安全组都要开放):

2376/tcp、2379/tcp、2380/tcp、6443/tcp、8472/udp、9099/tcp、10250/tcp、10254/tcp、30000-32767/tcp、udp

master:

node节点:

firewall-cmd --zone=public --add-port=6443/tcp --permanent && firewall-cmd --zone=public --add-port=10250/tcp --permanent && firewall-cmd --reload

kubeadm init常见问题:

问题1:[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
解决办法:
kubectl init 增加参数 --ignore-preflight-errors=NumCPU

问题2: [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
解决办法:
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables

永久解决可以写入启动脚本

五、安装flannel网络

用于k8s内部网络,否则dns一直不通,一直pending

 执行命令:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

 如果flannel还是启动失败,查看logs,显示如下图

则需降版使用,上面链接默认下载最新版的,例如0.18。

可以尝试使用0.15版本的,亲测有效。https://raw.githubusercontent.com/flannel-io/flannel/v0.15.0/Documentation/kube-flannel.yml

如果日志中出现,识别不到网卡的错误,则需要增加flannel启动参数增加网卡名称,修改如图: 

六、搭建完毕

七、额外知识

1、k8s工作原理:

kuberctl调用apiserver发送创建pod的请求,scheduler收到调度任务发送到符合要求的node节点,
node节点上的kubelet与docker daemon通信创建docker容器。

2、k8s组件:

(1)主要组件:

kube-apiserver 提供httprest接口的关键服务进程,是kubernetes里所有资源的增删查改操作的唯一入口,也是集群的入口进程。提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
kube-controller-manager kubernetes里所有资源对象的自动话控制中心,可以理解为资源对象的大总管。负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
kube scheduler 负责调度资源的进程,相当于调度室。负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
kubelet 用于管理pod容器的创建启停等任务,同时与master节点密切协作,实现集群管理的基本功能。负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
kube-proxy 实现kubernetes service 的通信与负载均衡的重要组件。负责为Service提供cluster内部的服务发现和负载均衡
kubectl kubenetes的控制管理命令行工具
etcd 用于存储需要持久化的数据(KV存储系统),保存了整个集群的状态。

Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);
kube-dns 用于域名解析,负责为整个集群提供DNS服务

Calico 一种容器之间互通的网络方案

(2)附加组件:
kube-aggregator通过聚合层扩展kubernetes api(kube-apiserver扩展)
kubeadm 用于创建集群.自动化的将多台Ubuntu或者CentOS主机组建成集群
kubectl-convert 一个kubectl的插件,允许将kubernetesApi版本转换到不同的版本
mounter
kubernetes-dashboard 可视化控制台,提供GUI
kubernetes-cni遵循网络接口规范,使pod拥有与在VPC网络上相同的IP地址
kubernetes-Flannel是由ConreOS主导设计的用于容器技术的覆盖网络(Overlaytwork),在Flannel管理的容器网络中,每一个宿主机都会拥有一个独立子网,用于分配给其上的容器使用。通信方式是基于隧道协议的UDP和VXLAN等方式封包、解包及传输。

Ingress Controller为服务提供外网入口
Heapster提供资源监控
Federation提供跨可用区的集群
Fluentd-elasticsearch提供集群日志采集、存储与查询
 

3、k8s控制器

Deployment:工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。
DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务。比如ELK服务
Job:只要完成就立即退出,不需要重启或重建。
Cronjob:周期性任务控制,不需要持续后台运行,
StatefulSet:管理有状态应用
ReplicaSet: 代用户创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能。

4、kubectl常用命令:

格式: kubectl an_action a_resource a_resource_name -flags
an_action:表示一个行动,例如:get、create或describe。deployment

1、kubectl cluster-info 查看集群信息
2、kubectl get componentstatuses查看集群master节点功能
3、kubectl get nodes --show-labels查看集群节点信息
4、kubectl describe node 10-0-0-171.node 描述某个节点的信息
5、kubectl get pods -o wide --all-namespaces 查询全部pod信息
6、kubectl get svc --all-namespaces -o wide 查看全部svc信息(service服务信息,相当于网关,pod入口)
7、kubectl get deployments --all-namespaces 查看全部deployments信息
8、kubectl get ingresses --all-namespaces 查看全部ingress信息
9、kubectl get secret --all-namespaces查看全部secret信息
10、kubectl get pv 查看全部pv信息
11、kubectl get pvc --all-namespaces 查看全部pvc信息
12、kubectl get job --all-namespaces -o wide 查看全部job信息
13、kubectl get pod weave-net-xhh0h --namespace=kube-system -o yaml 查看某pod的yaml文件内容
14、kubectl describe pod calico-etcd --namespace=kube-system 描述某pod的运行状态
15、kubectl describe svc kube-dns --namespace=kube-system 描述某svc的运行状态
16、kubectl describe deployments sitealive --namespace=cluster2016 描述某deployments的运行状态
17、kubectl delete pod sitealive-3553544168-q4gtx --namespace=wmcluster2016 删除某pod
18、kubectl logs proxycrawler-2347617609-mwzts --namespace=wmcluster2016 查询某pod的log
19、kubectl exec -it busybox -- sh 进去某pod的容器
20、kubectl run my-nginx --image=nginx --replicas=2 --port=80 创建两个监听80端口的nginx pods
21、kubectl delete deployment my-nginx 停止容器
22、kubectl edit pod/nginx -n default 修改yaml配置文件
23、kubectl api-versions 查看当前api的版本
24、kubectl -n kubernetes-dashboard patch svc kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}' 热更新打补丁的方式修改配置文件
25、kubectl scale --replicas=2 deployment/my-nginx 修改pod数量为2
26、kubectl create deployment my-nginx --image=nginx --port=80 --replicas=3  创建1个nginx deployment,它将创建3个监听80端口的nginx pods并保持
27、kubectl apply -f tomcat-deploy.yml 应用yaml配置文件
28、kubectl get pod <pod-name> -o wide 显示pod的更详细信息
29、kubectl get pod <pod-name> -o yaml 以yaml格式显示Pod的详细信息

30、kubectl delete pod tomcat --force --grace-period=0 强制删除pod,当pod一直处于terminating状态时使用(一般包含nfs挂载的pod很容易出现)

31、kubectl get deploy/nginx-deployment --export -o yaml > my-deploy.yaml 把现有的pod资源导出到yaml文件

Logo

华为云1024程序员节送福利,参与活动赢单人4000元礼包,更有热门技术干货免费学习

更多推荐