1. 安装要求
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
-
一台或多台机器,操作系统 CentOS7
-
硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
-
集群中所有机器之间网络互通
-
可以访问外网,需要拉取镜像
-
禁止swap分区
本次集群由三台机器搭建
-
k8s-master:192.168.147.131
-
k8s-node1:192.168.147.132
-
k8s-node2:192.168.147.133
建议升级centos7内核
-
更新yum源仓库
yum -y update
-
安装epel最新的仓库
导入密钥:rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
安装仓库: yum install https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
-
列出可安装的系统内核相关包
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
-
选择版本
lt是长支持版本
yum -y --enablerepo=elrepo-kernel install kernel-lt
ml是最新稳定版本
yum -y --enablerepo=elrepo-kernel install kernel-ml
-
设置默认启动项
vim /etc/default/grub
使GRUB_DEFAULT=0
-
重新生成grub配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
-
重启并查看内核版本
reboot #重启
uname -sr #查看内核版本
2. 准备环境(master、node节点都需执行)
-
关闭防火墙:(nftables后端兼容性问题,产生重复的防火墙规则) systemctl stop firewalld systemctl disable firewalld
-
关闭selinux:关闭selinux以允许容器访问宿主机的文件系统,linux下的一个安全机制,主要是对文件系统访问做一个权限控制,这个权限控制会影响到kubernetes中的一个组件kuberlete的安装,因为这个组件的安装会访问本地的文件操作系统 setenforce 0 #临时关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config #永久关闭
vi /etc/sysconfig/selinux
修改以下参数,设置为disable
SELINUX=disabled
-
关闭swap:Kubernetes 在启用 Swap 时不知道如何处理内存驱逐,swap分区的作用是当物理内存不足时,利用swap分区做数据交换,但是在kubernetes中完全不支持swap分区
swapoff -a #临时关闭 vi /etc/fstab #永久关闭,删除swap配置哪一行
-
修改主机名 方便部署时区别节点
hostnamectl set-hostname 《hostname》
-
添加主机名与IP对应关系(记得设置主机名): cat /etc/hosts 192.168.147.131 k8s-master 192.168.147.132 k8s-node1 192.168.147.133 k8s-node2
-
将桥接的IPv4流量传递到iptables的链:有一些ipv4的流量不能走iptables链【linux内核的一个过滤器,每个流量都会经过他,然后再匹配是否可进入当前应用进程去处理】,导致流量丢失
cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF
-
使命令生效 若提示***不存在,执行 modprobe br_netfilter
-
时间同步:启动chronyd系统服务
yum install ntpdate -y
ntpdate time.windows.com
2.安装DOCKER(master、node节点都需执行)
-
安装docker
下载docker镜像
安装必要的系统工具
yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
安装docker
yum makecache fast
yum -y install docker-ce
重启动docker,并设置开机自启
systemctl enable docker && systemctl start docker
查看docker版本
docker --version
-
添加阿里云yum源
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=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
3. 安装KUBEADM,KUBELET和KUBECTL(master、node节点都需执行)
kubelet: 运行在cluster所有节点上,负责启动POD和容器
kubeadm: 用于初始化cluster
kubectl: :kubectl是kubenetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件
-
指定版本安装
yum install -y kubelet-1.21.2 kubeadm-1.21.2 kubectl-1.21.2 systemctl enable kubelet
-
部署k8s初始化操作 (仅master节点执行 )
kubeadm init --kubernetes-version=1.21.2 --apiserver-advertise-address=10.254.253.10 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16
kubernetes-version:要安装的版本
pod-network-cidr:负载容器的子网网段
image-repository:指定镜像仓库(由于从阿里云拉镜像,解决了k8s.gcr.io镜像拉不下来的问题)
apiserver-advertise-address:节点绑定的服务器ip(多网卡可以用这个参数指定ip)
v=6:用法是初始化过程显示详细内容 -
运行kebeadm init 初始化报错 failed to pull image registry.aliyuncs.com/google_containers/coredns:v1.8.0
-
使用docker 命令拉去镜像
docker pull registry.aliyuncs.com/google_containers/coredns:1.8.0
-
使用的docker拉取的镜像不符合k8s需要的命名,需要进行更改
-
重命名
docker tag registry.aliyuncs.com/google_containers/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns:v1.8.0
-
删除原有镜像
docker rmi registry.aliyuncs.com/google_containers/coredns:1.8.0
-
-
再次运行初始化命令
-
-
使用kubectl工具
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf
HOME/.kube/config sudo chown $(id -u):
(id -g) $HOME/.kube/config
查看启动节点
kubectl get nodes
4. 安装POD网络插件( CNI )(master、node节点都需执行)
-
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml(需科学性上网拉取)
或在yaml文件的image属性值改成国内 lizhenliang/flannel:v0.11.0-amd64 镜像
或到 http://ip.tool.chinaz.com/ 查询 raw.githubusercontent.com/coreos 的IP 地址
把查询到的地址添加到 /etc/hosts做主机ip映射
-
安装POD网络插件报 The connection to the server localhost:8080 was refused - did you specify the right host or port?
需设置环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile
-
安装flannel网络创建报The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port?
原因外网不能使用
解决办法
# 在https://www.ipaddress.com/查询raw.githubusercontent.com的真实IP。
vim /etc/hosts
185.199.108.133 raw.githubusercontent.com -
使用查看kube-flannel是否为running状态
kubectl get pods -n kube-system
-
让Node节点添加到master节点中
由master节点执行kubeadm init 生成的最后生成的token 复制到node节点
添加之前,先在node节点执行
kubeadm reset
命令例:kubeadm join 192.168.147.128:6443 --token rm1llx.6cuij6c60fhdfwd1 --discovery-token-ca-cert-hash sha256:62d9066bcbd7f0aa77e49a3d0b484d1640bf01ac8c2f99b1e0bc68839b24692d
-
重新生成token (master执行)
kubeadm token create --print-join-command
-
pod的kube-flannel-ds-*** 的STATUS为init:ImagePullBackOff
到https://github.com/flannel-io/flannel/releases 下载日志中缺少的flanneld的版本
-
通过xftp导入到docker中运行
例:docker pull flanneld-v0.14.0-amd64.docker
-
通过 kubectl get pods -n kube-system 查看pods状态是否正常
测试K8S集群 (master执行)
在k8s集群中插件一个pod验证是否正常
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort(type=NodePort 设置为外部暴露)
kubectl get pod,svc
通过查询出来的端口配合node节点的ip在外部浏览器进行访问 出现nginx的信息即可
部署 Dashboard(master执行)
Kubernetes Dashboard 是 k8s集群的⼀个 WEB UI管理⼯具
-
使用国外GitHub拉取Dashboard版本,github上有k8s版本对应的版本信息
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
-
修改Dashboard文件名
mv recommended.yaml kubernetes-dashboard.yaml
-
进入 kubernetes-dashboard.yaml 添加通信方式和对外暴露的端口
NodePort 服务是引导外部流量到你的服务的最原始方式,在节点上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务供外部访问。
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort #需添加访问方式
ports:
- port: 443
targetPort: 8443
nodePort: 31002 #需添加对外暴露的端口 -
重新生成dashboard
kubectl apply -f kubernetes-dashboard.yaml
-
查看pod,svc状态:
kubectl get pod,svc -n kubernetes-dashboard
-
因为证书问题,解决k8s自签名SSL验证不通过的问题,以chrome为例
chrome://flags/#allow-insecure-localhost
And enable "Allow invalid certificates for resources loaded from localhost.
-
获取token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep dashboard-admin|awk '{print $1}')|grep token:|awk '{print $2}'
-
创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}') -
输入生成tokan访问dashboard