kubernetes部署文档-超详细

kubernetes部署文档-超详细_第1张图片

目录

​编辑

基础信息

部署方式: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

kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:

  1. kubeadm init   使用该命令可以创建master节点
  2. kubeadm join  使用该命令可以将节点加入集群成为worker节点

官方地址:Kubeadm | Kubernetes

部署要求

  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 无swap分区或禁用swap分区

环境信息

  • kubernetes版本:1.23.5
  • docker版本:20.10.14
  • 物理节点信息:

主机名

角色

操作系统

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

#关闭firewalld
systemctl stop firewalld

#禁止firewalld开机自启
systemctl disable firewalld

禁用selinux

#临时关闭selinux
setenforce 0

#永久关闭,修改为SELINUX=disabled
vim /etc/selinux/config 

禁用swap分区

swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备。

#关闭swap分区
swapoff -a

#注释swap分区
vim /etc/fstab

#查看swap分区是否禁用
free

配置iptables

修改内核参数,将桥接的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

安装配置docker

kubernetes集群是基于docker容器组成的,所以需要先安装配置docker。

docker安装教程:docker-ce安装教程-阿里巴巴开源镜像站

安装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

#指定版本安装Docker-CE

yum -y install docker-ce-20.10.14

配置docker

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

部署k8s集群

添加kubernetes阿里云源

#创建并编辑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、kubelet、kubectl

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集群(master)

--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

开始初始化:

kubernetes部署文档-超详细_第2张图片

初始化完成:

kubernetes部署文档-超详细_第3张图片

master节点配置(master)

#如果是非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部署文档-超详细_第4张图片

安装calico网络组件(master)

支持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

kubernetes部署文档-超详细_第5张图片

等待calico和coredns pod running

kubernetes部署文档-超详细_第6张图片

calico和coredns pod 已经running,master也变为ready状态

kubernetes部署文档-超详细_第7张图片

生成永久token(master)

通常使用初始化后给出的命令即可添加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创建过程:

kubernetes部署文档-超详细_第8张图片

添加worker节点(worker) 

#在所有worker节点运行此命令,即可将节点加入集群
kubeadm join 172.31.246.16:6443 --token 137xxs.4lsswm85co5399fg \
        --discovery-token-ca-cert-hash sha256:e8cc4aefe577e0d8bdfdead977810a7c8bca2b48bbe082c3ed286dcdb5670adb 

如下图所示表示,节点已加入集群:

kubernetes部署文档-超详细_第9张图片

如下图所示,node1、node2均已加入集群,但node2为notready状态,这是因为node2的组件还在创建中,一段时间后会变为running,时间长短取决于网络等其他系统环境。

kubernetes部署文档-超详细_第10张图片

如下图所示,两个worker均已ready。

kubernetes部署文档-超详细_第11张图片

备注:

#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

 安装kubernetes-dashboard(master)

#下载dashboard的yaml文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml

recommended.yaml文件:阿里云盘分享

kubernetes部署文档-超详细_第12张图片

#编辑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

如下图所示:

kubernetes部署文档-超详细_第13张图片

#创建danshboard
kubectl create -f recommended.yaml
#查看所有pod
kubectl get pods --all-namespaces

如下图所示,kubernetes-dashboard-fb8648fd9-4sglz这个pod状态为ImagePullBackOff,代表拉取该pod的容器镜像失败

kubernetes部署文档-超详细_第14张图片

ImagePullBackOff问题解决方案

#查看该pod的详细信息
kubectl describe pod/kubernetes-dashboard-fb8648fd9-4sglz --namespace=kubernetes-dashboard

通过上述命令可以得到如下信息,其中有两个重要信息:

  1. 拉取失败的镜像为:kubernetesui/dashboard:v2.5.1
  2. 该pod被调度到了node1节点

kubernetes部署文档-超详细_第15张图片

#根据上述信息我们来到node1节点尝试拉取镜像
docker pull kubernetesui/dashboard:v2.5.1

如下图所示,手动拉取失败,原因是2020年开始docker对pull镜像的次数做了限制,所以拉不下来了。

解决办法:

  1. 更换docker镜像加速器
  2. 找一个可以pull的环境,打包镜像,拷贝到node1

这里采用第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节点可以下载镜像

kubernetes部署文档-超详细_第16张图片

在node1导入镜像

kubernetes部署文档-超详细_第17张图片

#由于在recommended.yaml中,默认是拉取镜像直接拉取镜像,而不使用本地镜像,因此需要修改相应参数
#找到deployment段落,修改镜像拉取策略 imagepullpolicy
vim recommended.yaml

镜像拉取策略共有三种:

  1. Always:总是从远程仓库拉取镜像(一直远程下载)
  2. IfNotPresent:本地有则使用本地镜像,本地没有则从远程仓库拉取镜像(本地有就本地 本地没则远程下载)
  3. Never:只使用本地镜像,从不去远程仓库拉取,本地没有就报错 (一直使用本地)

recommended.yaml文件为Always,这里改为Never

kubernetes部署文档-超详细_第18张图片

kubernetes部署文档-超详细_第19张图片

#再次部署dashboard,注意此次部署使用的是apply命令,而不是create。

kubectl apply -f recommended.yaml

如图所示,dashboard pod状态为running

kubernetes部署文档-超详细_第20张图片

此时再看一下该pod创建的过程,可以发现没有再去远程拉取镜像,而是直接使用本地镜像。

kubernetes部署文档-超详细_第21张图片

访问k8s-dashboard界面

网址:https://主机IP:32333 (三个节点的主机IP均可访问)

kubernetes部署文档-超详细_第22张图片

#登录方式有两种,这里使用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

kubernetes部署文档-超详细_第23张图片

登录

kubernetes部署文档-超详细_第24张图片

使用rook在kubernetes集群中部署ceph 

你可能感兴趣的:(kubernetes,kubernetes,云原生)