目录
编辑
基础信息
部署方式:kubeadm
部署要求
环境信息
基础配置
修改主机名
配置主机名解析
配置时间同步
禁用firewalld
禁用selinux
禁用swap分区
配置iptables
常用工具下载
安装配置docker
安装docker
配置docker
部署k8s集群
添加kubernetes阿里云源
安装kubeadm、kubelet、kubectl
初始化kubernetes集群(master)
master节点配置(master)
安装calico网络组件(master)
生成永久token(master)
添加worker节点(worker)
安装kubernetes-dashboard(master)
ImagePullBackOff问题解决方案
访问k8s-dashboard界面
kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:
- kubeadm init 使用该命令可以创建master节点
- kubeadm join 使用该命令可以将节点加入集群成为worker节点
官方地址:Kubeadm | Kubernetes
主机名 |
角色 |
操作系统 |
ip地址 |
master |
master |
centos 7.6 |
172.31.246.16 |
node1 |
worker |
centos 7.6 |
172.31.246.17 |
node2 |
worker |
centos 7.6 |
172.31.246.20 |
注:以下部署流程,如无标注master或worker,则为所有节点均需配置
#对应节点修改主机名
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2
#编辑/etc/hosts文件
vim /etc/hosts
#添加如下内容
172.31.246.16 master
172.31.246.17 node1
172.31.246.20 node2
#编辑chrony配置文件
vim /etc/chrony.conf
#从阿里云ntp服务器同步时间,添加如下内容
server ntp.aliyun.com iburst
#重启chronyd
systemctl restart chronyd
#查看时间源是否配置成功
chronyc sources -v
#查看所有节点时间是否一致
date
#关闭firewalld
systemctl stop firewalld
#禁止firewalld开机自启
systemctl disable firewalld
#临时关闭selinux
setenforce 0
#永久关闭,修改为SELINUX=disabled
vim /etc/selinux/config
swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备。
#关闭swap分区
swapoff -a
#注释swap分区
vim /etc/fstab
#查看swap分区是否禁用
free
修改内核参数,将桥接的IPv4流量传递到iptables的链
#创建并编辑k8s.conf文件
vim /etc/sysctl.d/k8s.conf
#添加以下内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#重新加载内核参数
sysctl --system
#已有的会更新到最新版本,没有的下载
yum install vim bash-completion net-tools gcc -y
kubernetes集群是基于docker容器组成的,所以需要先安装配置docker。
docker安装教程:docker-ce安装教程-阿里巴巴开源镜像站
#安装必要的一些系统工具
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
#指定版本安装Docker-CE
yum -y install docker-ce-20.10.14
1、配置阿里云镜像加速器,使用加速器可以提升获取Docker官方镜像的速度,否则可能因连接超时导致镜像拉取失败。
2、systemd是Kubernetes默认的cgroup管理器, cgroupfs是docker默认的cgroup管理器,这样就同时运行有两个cgroup控制管理器, 当资源有压力的情况时,有可能出现不稳定的情况;Kubernetes推荐使用systemd来替代cgroupfs,因此将docker的cgroup管理器改为systemd,若不修改在kubeadm init时有警告提示。
#创建/etc/docker文件夹
mkdir -p /etc/docker
#创建并编辑daemon.json文件,配置镜像加速和systemd
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://fhzep8jf.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
#重新加载docker配置文件
systemctl daemon-reload
#重启docker
systemctl restart docker
#设为开机自启
systemctl enable docker
#创建并编辑kubernetes.repo
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
kubeadm
kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具通过kubeadm init和kubeadm join两条指令快速搭建kubernetes集群。
kubectl
kubectl 是kubernetes集群的命令行管理工具,除此之外还可以通过kubernetes-dashboard管理kubernetes集群。
kubelet
Kubelet 是 Master 节点安插在 Node 节点上的“眼线”,kubernetes通过kubelet来管理worker节点;在 Kubernetes 集群中,在每个 Node 上都会启动一个 kubelet 服务进程。该进程用于处理 Master 下发到本节点的任务,定期向 Master 汇报节点资源的使用情况,管理 Pod 及 Pod 中的容器。
#指定版本下载
yum install kubectl-1.23.5 kubelet-1.23.5 kubeadm-1.23.5 -y
#设置kubelet开机自启,否则kubeadm init时会有警告提示
#此时无需(也无法start)systemctl start kubectl,接下来执行kubectl init时会自动start
systemctl enable kubelet
--kubernetes-version=1.23.5
指定要安装的 Kubernetes 版本。
--apiserver-advertise-address=172.31.246.16
指定集群master节点的IP地址,即apiserver所在节点的地址,并告知其他组件、节点apiserver在哪。
--image-repository registry.aliyuncs.com/google_containers
指定用于 Kubernetes 组件的容器镜像仓库。
--service-cidr=10.10.0.0/16
指定 Kubernetes service的IP地址范围。
--pod-network-cidr=10.122.0.0/16
指定 Kubernetes Pod的IP地址范围。
总的来说,这个命令将初始化一个版本号为1.23.5的kubernetes集群,并将172.31.246.16用作master节点,同时指定service和pod的IP地址范围。
#初始化集群
kubeadm init --kubernetes-version=1.23.5 \
--apiserver-advertise-address=172.31.246.16 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16
开始初始化:
初始化完成:
#如果是非root用户,执行以下三条命令
#创建一个 .kube 目录并将 admin.conf 文件复制到该目录下的 config 文件中,然后更改文件的所有者为当前用户。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#root用户,执行以下命令即可通过kubectl管理集群
export KUBECONFIG=/etc/kubernetes/admin.conf
#查看kubernetes节点
kubectl get nodes
#查看所有的pod
kubectl get pods --all-namespaces
如下图所示:此时master处于notready状态,这是因为还未安装网络组件,接下来安装网络组件。
支持kubernetes的网络组件有很多,这里选择calico
kubernetes官网推荐的网络组件:安装扩展(Addons) | Kubernetes
calico官网安装教程:Quickstart for Calico on Kubernetes
#下载calico.yaml文件
curl https://docs.projectcalico.org/v3.18/manifests/calico.yaml -O
#安装calico
kubectl apply -f calico.yaml
calico配置文件: 阿里云盘分享
下载部署calico
等待calico和coredns pod running
calico和coredns pod 已经running,master也变为ready状态
通常使用初始化后给出的命令即可添加worker节点,但但命令有限期只有24小时,因此可以自己重新生成一个永不过期的命令,这样便于后期增加worker节点时直接使用,免去临时重新生成token的步骤。
kubeadm join 172.31.246.16:6443 --token azmi9i.gr7n1zaww51emhw4 \
--discovery-token-ca-cert-hash sha256:e8cc4aefe577e0d8bdfdead977810a7c8bca2b48bbe082c3ed286dcdb5670adb
#查看现有token
kubeadm token list
#创建一个永不过期的token
kubeadm token create --ttl 0
#获取ca证书sha256编码hash值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
#这样我们就可以得到新的join命令
kubeadm join 172.31.246.16:6443 --token 137xxs.4lsswm85co5399fg \
--discovery-token-ca-cert-hash sha256:e8cc4aefe577e0d8bdfdead977810a7c8bca2b48bbe082c3ed286dcdb5670adb
如下图所示为永久token创建过程:
#在所有worker节点运行此命令,即可将节点加入集群
kubeadm join 172.31.246.16:6443 --token 137xxs.4lsswm85co5399fg \
--discovery-token-ca-cert-hash sha256:e8cc4aefe577e0d8bdfdead977810a7c8bca2b48bbe082c3ed286dcdb5670adb
如下图所示表示,节点已加入集群:
如下图所示,node1、node2均已加入集群,但node2为notready状态,这是因为node2的组件还在创建中,一段时间后会变为running,时间长短取决于网络等其他系统环境。
如下图所示,两个worker均已ready。
备注:
#worker节点是无法运行kubectl命令的,因为worker节点没有admin.conf文件
#若需在worker节点使用kubectl命令,需要将admin.conf配置文件拷贝到worker节点,再执行以下命令:
scp root@master:/etc/kubernetes/admin.conf /etc/kubernetes/
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile
#下载dashboard的yaml文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml
recommended.yaml文件:阿里云盘分享
#编辑recommended.yaml,找到service段落,做如下修改
#在service里添加nodeport,这样可以通过 <主机ip+port> 来访问dashboard
vim recommended.yaml
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort #增加此行,指定service类型为NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 32333 #增加此行,指定绑定的node的端口(默认的取值范围是:30000-32767), 如果不指定,
会默认分配
selector:
k8s-app: kubernetes-dashboard
如下图所示:
#创建danshboard
kubectl create -f recommended.yaml
#查看所有pod
kubectl get pods --all-namespaces
如下图所示,kubernetes-dashboard-fb8648fd9-4sglz这个pod状态为ImagePullBackOff,代表拉取该pod的容器镜像失败
#查看该pod的详细信息
kubectl describe pod/kubernetes-dashboard-fb8648fd9-4sglz --namespace=kubernetes-dashboard
通过上述命令可以得到如下信息,其中有两个重要信息:
#根据上述信息我们来到node1节点尝试拉取镜像
docker pull kubernetesui/dashboard:v2.5.1
如下图所示,手动拉取失败,原因是2020年开始docker对pull镜像的次数做了限制,所以拉不下来了。
解决办法:
这里采用第2种方法。
#找一个可以pull镜像的节点
docker pull kubernetesui/dashboard:v2.5.1
#打包镜像
docker save -o k8s-dashboard.tar kubernetesui/dashboard:v2.5.1
#将镜像包拷贝至node1节点
scp k8s-dashboard.tar root@node1:/root/
#在node1节点导入镜像
docker load -i /root/k8s-dashboard.tar
如下图所示,master节点可以下载镜像
在node1导入镜像
#由于在recommended.yaml中,默认是拉取镜像直接拉取镜像,而不使用本地镜像,因此需要修改相应参数
#找到deployment段落,修改镜像拉取策略 imagepullpolicy
vim recommended.yaml
镜像拉取策略共有三种:
recommended.yaml文件为Always,这里改为Never
#再次部署dashboard,注意此次部署使用的是apply命令,而不是create。
kubectl apply -f recommended.yaml
如图所示,dashboard pod状态为running
此时再看一下该pod创建的过程,可以发现没有再去远程拉取镜像,而是直接使用本地镜像。
网址:https://主机IP:32333 (三个节点的主机IP均可访问)
#登录方式有两种,这里使用token登录
#创建账号
kubectl create serviceaccount dashboard-admin -n kube-system
#授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
#获取token信息
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
#token
eyJhbGciOiJSUzI1NiIsImtpZCI6IlBuRGphS0VCaWQ5X1dtZzRTWm1uendhbGJGLUNieXNpeTlfXzZuNURIYWMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4temhyd24iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNjZiNTA3YzAtYmE1ZS00NjJiLTljZDAtOGQ4NWY2OWFiMTc0Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.q2VEbL4izZVC2phz9UqQWlrHI3Bt3CVJ_BC9W4PN4QBCxacYr2zCf_DYLac0nzLI9rk1TtYbTcwQ4nculIW0-ogoIFCdwAA4lhEb9TDT1yrMMO9WVzO8zm_KvFWuo-qXmM0FKbg4fWPKJIZ18SovSHLGkqjhhAgmqcOd6-u7OxY-XWcbOYy_K7KQX7HOufHcgZV5y1zeJ0Ov8eprHy-Tdo6GNbOQRX2iERGMY9G2AF9giI6nxWXd-e_wk5yg2MZe-egeEV60fzUktd8U1tkck96vDttBTZo5stttq-Woh2lLJHzSxyFiLVCb0W5BuRRHLZdBZEGyB7DdU0pmsQcRCw
获取token
登录
使用rook在kubernetes集群中部署ceph