目录
一、前期准备
1)前提条件
- 三台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 - - Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
- 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
- 2 CPU 核或更多
- 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
- 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。
- 开启机器上的某些端口。
- 禁用交换分区。为了保证 kubelet 正常工作,必须 禁用交换分区。
2)机器信息
机器类型操作系统网卡IP节点类型VMware虚拟机centos8ens33192.168.0.113k8s-masterVMware虚拟机centos8ens33192.168.0.114k8s-node1VMware虚拟机centos8ens33192.168.0.115k8s-node2修改主机名- # 在192.168.0.113执行
- $ hostnamectl set-hostname k8s-master
- # 在192.168.0.114执行
- $ hostnamectl set-hostname k8s-node1
- # 在192.168.0.115执行
- $ hostnamectl set-hostname k8s-node2
复制代码 时间同步- $ yum install chrony -y
- $ systemctl start chronyd
- $ systemctl enable chronyd
- $ chronyc sources
复制代码 3)确保每个节点上 MAC 地址和 product_uuid 的唯一性
- 你可以使用命令 ip link来获取网络接口的 MAC 地址
- 可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验
一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes 使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装 失败。
4)允许 iptables 检查桥接流量(可选)
- 确保 br_netfilter 模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter 来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter。
- 为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1。所有节点都执行以下命令:
- $ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
- br_netfilter
- EOF
- $ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
- net.bridge.bridge-nf-call-ip6tables = 1
- net.bridge.bridge-nf-call-iptables = 1
- EOF
- # 手动加载所有的配置文件
- $ sudo sysctl --system
复制代码
2)关闭防火墙
- # 安装yum-config-manager配置工具
- $ yum -y install yum-utils
- # 设置yum源
- $ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- # 安装docker-ce版本
- $ sudo yum install -y docker-ce
- # 启动
- $ sudo systemctl start docker
- # 开机自启
- $ sudo systemctl enable docker
- # 查看版本号
- $ sudo docker --version
- # 查看版本具体信息
- $ sudo docker version
- # Docker镜像源设置
- # 修改文件 /etc/docker/daemon.json,没有这个文件就创建
- # 添加以下内容后,重启docker服务:
- {
- "registry-mirrors": ["http://hub-mirror.c.163.com"]
- }
- $ sudo systemctl restart docker
复制代码 3)关闭swap
kubelet 在 1.8 版本以后强制要求 swap 必须关闭。要不然kubelet 无法正常启动
- $ echo "192.168.0.113 k8s-master" >> /etc/hosts
- $ echo "192.168.0.114 k8s-node1" >> /etc/hosts
- $ echo "192.168.0.115 k8s-node2" >> /etc/hosts
- # 查看
- $ cat /etc/hosts
复制代码 4)将 SELinux 设置为 disabled模式(相当于将其禁用)
- $ systemctl stop firewalld
- $ systemctl disable firewalld
复制代码 5)配置yum源,这里配置阿里云的源
- # 临时关闭;关闭swap主要是为了性能考虑
- $ swapoff -a
- # 可以通过这个命令查看swap是否关闭了
- $ free
- # 永久关闭
- $ sed -ri 's/.*swap.*/#&/' /etc/fstab
复制代码 如果不加入环境变量,会出现如下报错:
8)安装Pod网络插件(CNI:Container Network Interface)(master)
你必须部署一个基于 Pod 网络插件的 容器网络接口 (CNI),以便你的 Pod 可以相互通信。
- # 临时关闭
- $ sudo setenforce 0
- # 永久禁用
- $ sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
复制代码 如果上面安装失败,则下载我百度里的,离线安装
链接:https://pan.baidu.com/s/1HB9xuO3bssAW7v5HzpXkeQ
提取码:8888
- $ cat > /etc/yum.repos.d/kubernetes.repo << EOF
- [k8s]
- name=k8s
- enabled=1
- gpgcheck=0
- baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
- EOF
复制代码
查看集群信息- $ sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
- # disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库
- # 设置为开机自启并现在立刻启动服务 --now:立刻启动服务
- $ sudo systemctl enable --now kubelet
- # 查看状态
- $ systemctl status kubelet
复制代码
9)Node节点加入集群
如果没有令牌,可以通过在控制平面节点上运行以下命令来获取令牌:- $ kubectl version
- $ yum info kubeadm
复制代码
默认情况下,令牌会在24小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌:- $ kubeadm token create# 再查看$ kubectl version
- $ yum info kubeadm
复制代码
如果你没有 --discovery-token-ca-cert-hash 的值,则可以通过在控制平面节点上执行以下命令链来获取它:- # 手动拉取默认版本的coredns镜像
- $ docker pull registry.aliyuncs.com/google_containers/coredns
复制代码
如果执行kubeadm init时没有记录下加入集群的命令,可以通过以下命令重新创建(推荐)一般不用上面的分别获取token和ca-cert-hash方式,执行以下命令一气呵成:
以下命令在node节点执行**- # 查看集群信息$ sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
- # disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库
- # 设置为开机自启并现在立刻启动服务 --now:立刻启动服务
- $ sudo systemctl enable --now kubelet
- # 查看状态
- $ systemctl status kubelet
复制代码 【问题】这里可能会报错 localhost:10248拒绝访问,这个无解,重装系统解决
【解决】
重置节点信息- $ kubeadm init \
- --apiserver-advertise-address=192.168.0.113 \
- --image-repository registry.aliyuncs.com/google_containers \
- --kubernetes-version v1.22.1 \
- --service-cidr=10.1.0.0/16 \
- --pod-network-cidr=10.244.0.0/16
复制代码 需要将master节点的 /etc/kubernetes/admin.conf复制到node节点的相同位置
执行下面的代码加入环境变量- $ systemctl daemon-reload
- $ systemctl restart kubelet
复制代码 修改docker的cgroup driver,修改或创建/etc/docker/daemon.json,加入下述内容:- {
- "exec-opts": ["native.cgroupdriver=systemd"]
- }
复制代码 重新加载- $ cat /etc/docker/daemon.json
- $ systemctl daemon-reload
- $ systemctl restart docker
- # 查看docker的cgroup driver
- $ docker info | grep Cgroup
复制代码- $ sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
- # disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库
- # 设置为开机自启并现在立刻启动服务 --now:立刻启动服务
- $ sudo systemctl enable --now kubelet
- # 查看状态
- $ systemctl status kubelet
复制代码
安装flannel网络插件,采用离线安装,kube-flanel.yml文件上面有- $ kubeadm init \
- --apiserver-advertise-address=192.168.0.113 \
- --image-repository registry.aliyuncs.com/google_containers \
- --kubernetes-version v1.22.1 \
- --service-cidr=10.1.0.0/16 \
- --pod-network-cidr=10.244.0.0/16
复制代码 将node节点加入到集群中- $ docker images# --v=5:显示详细信息$ kubeadm join 192.168.0.113:6443 --token cgmxso.bfgou00m72tnbpz4 --discovery-token-ca-cert-hash sha256:b4792b0f3b54c8b8b71a4a484129b4e2acfe5014c37b1b18dbebbc0c8f69fc15 --v=5
复制代码
另一个node节点同上操作
【问题】STATUS一直为NotReady
首先使用如下命令来看一下kube-system的 pod 状态:- # 临时生效(退出当前窗口重连环境变量失效)
- $ export KUBECONFIG=/etc/kubernetes/admin.conf
- # 永久生效(推荐)
- $ echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
- $ source ~/.bash_profile
复制代码
如上,可以看到 pod kube-flannel 的状态是ImagePullBackoff,意思是镜像拉取失败了,所以我们需要手动去拉取这个镜像。这里可以看到某些 pod 运行了两个副本是因为我有两个节点存在了。
也可以通过kubectl describe pod -n kube-system 来查看某个服务的详细情况,如果 pod 存在问题的话,你在使用该命令后在输出内容的最下面看到一个[Event]条目,如下:- $ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
复制代码
【解决】手动拉取镜像- $ kubectl apply -f kube-flannel.yml
- $ docker images
复制代码 修改完了之后过几分钟 k8s 会自动重试,等一下就可以发现不仅flannel正常了,其他的 pod 状态也都变成了Running,这时再看 node 状态就可以发现问题解决了:
四、清理
如果你在集群中使用了一次性服务器进行测试,则可以关闭这些服务器,而无需进一步清理。你可以使用 kubectl config delete-cluster 删除对集群的本地引用。
1)先将节点设置为维护模式(k8s-node1是节点名称)2)在删除节点之前,请重置 kubeadm 安装的状态:- $ kubeadm init \
- --apiserver-advertise-address=192.168.0.113 \
- --image-repository registry.aliyuncs.com/google_containers \
- --kubernetes-version v1.22.1 \
- --service-cidr=10.1.0.0/16 \
- --pod-network-cidr=10.244.0.0/16
复制代码 3)重置过程不会重置或清除 iptables 规则或 IPVS 表。如果你希望重置 iptables,则必须手动进行:- $ kubeadm token create
- # 再查看
- $ kubeadm token list
复制代码 4)如果要重置 IPVS 表,则必须运行以下命令:- $ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
- openssl dgst -sha256 -hex | sed 's/^.* //'
复制代码 5)现在删除节点:- $ kubeadm token create --print-join-command
复制代码 五、搭建K8S Dashboard
1)下载dashboard文件:- # 查看集群信息
- $ kubectl get nodes
复制代码 如果地址不可用可以使用下面的地址下载
链接:https://pan.baidu.com/s/1-tEablkFTrMC-N9-8T7rrA
提取码:8888
安装验证,查看服务被分配到哪个节点上:$ scp /etc/kubernetes/admin.conf 192.168.0.114:/etc/kubernetes/
$ scp /etc/kubernetes/admin.conf 192.168.0.115:/etc/kubernetes/- $ scp /etc/kubernetes/admin.conf 192.168.0.114:/etc/kubernetes/
- $ scp /etc/kubernetes/admin.conf 192.168.0.115:/etc/kubernetes/
复制代码
从上图可知,服务被分配到了k8s-node1,对外端口为nodePort:31080,配置文件里的。
谷歌浏览器访问不了,原因是部署UI的镜像中默认自带的证书是一个不可信任的证书,则先用火狐访问:https://nodeIp:nodePort
https://192.168.0.114:31080
获取token测试- $ echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
- $ source ~/.bash_profile
复制代码
解决谷歌浏览器不能访问的问题,通过生成新的证书永久解决- {
- "exec-opts": ["native.cgroupdriver=systemd"]
- }
复制代码
服务调度到k8s-node2节点上了,访问
https://192.168.0.115:31080
现在Google浏览器也可以访问了
再获取token登录- $ echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
- $ source ~/.bash_profile
复制代码
以上就完整版K8s安装流程了~
来源:https://www.cnblogs.com/liugp/p/16357445.html
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |