容器编排——Kubeadm在线或离线搭建kubernetes单机
目录1、组件介绍:(1)Master组件:① Etcd:② API server:③ Controller Manager:④ Scheduler:(2)Node组件:① Kubelet:② Proxy:2、修改主机名称:3、修改hosts配置文件:4、关闭selinux:5、关闭防火墙:6、关闭swap:7、设置iptables网桥:8、软件k8s/docker/dashboard版本:9、安装
目录
② 安装安装kubeadm/kubelet/kubectl:
② 获取kubeadm/kubelet/kubectl离线包:
③ 上传kubeadm/kubelet/kubectl离线包:
1、组件介绍:
(1)Master组件:
① Etcd:
etcd是一个数据库,它的目标是构建一个高可用的分布式键值数据库,它是基于GO语言实现。在分布式系统中,各种服务的配置信息的管理分享,服务的发现是一个很基本同时也是很重要的问题。在K8s中用于持久化存储集群中所有的资源对象,如Node、Service、Pod、RC、Namespace等;
② API server:
API Server提供了操作etcd的封装接口API,这些API基本上都是集群中资源对象的增删改查及监听资源变化的接口。它提供了资源对象的唯一操作入口,其他所有组件都必须通过它提供的API来操作资源数据,通过对相关的资源数据“全量查询”+“变化监听”,这些组件可以很“实时”地完成相关的业务功能。
③ Controller Manager:
集群内部的管理控制中心,其主要目的是实现Kubernetes集群的故障检测和恢复的自动化工作,比如根据RC的定义完成Pod的复制或移除,以确保Pod实例数符合RC副本的定义;根据Service与Pod的管理关系,完成服务的Endpoints对象的创建和更新;其他诸如Node的发现、管理和状态监控、死亡容器所占磁盘空间及本地缓存的镜像文件的清理等工作也是由Controller Manager完成的。
④ Scheduler:
集群中的调度器,负责Pod在集群节点中的调度分配。
(2)Node组件:
① Kubelet:
负责本Node节点上的Pod的创建、修改、监控、删除等全生命周期管理,同时Kubelet定时“上报”本Node的状态信息到API Server里。
② Proxy:
实现了Service的代理与软件模式的负载均衡器
2、修改主机名称:
修改/etc/hostname文件,修改对应的名称为主机名称。
然后重新启动服务器。
3、修改hosts配置文件:
修改/etc/hosts文件添加主机名与IP映射关系:
4、关闭selinux:
集群中所有服务器,修改/etc/selinux/config文件中SELINUX=的值为:disabled,然后重新启动服务器:
5、关闭防火墙:
执行以下命令:
关闭防火墙:
systemctl stop firewalld.service
关闭防火墙自启:
systemctl disable firewalld.service
6、关闭swap:
编辑/etc/fstab配置文件,将包含swap的行使用#进行注释,然后保存配置文件。最后重新启动服务器。
7、设置iptables网桥:
执行命令:
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
执行命令:
sysctl --system
8、软件k8s/docker/dashboard版本:
软件k8s、docker、dashboard在版本上有一定的兼容关系:
K8s版本 | Docker版本 | Dashboard版本 |
V1.22 | 兼容最新到V20.10 | 暂时没有找到版本 |
V1.21 | 兼容最新到V20.10 | V2.3.1/V2.3.0 |
V1.20 | 有变化暂未懂,应该与V1.17相同 | V2.3.1/V2.3.0/V2.2.0/V2.1.0 |
V1.19 | 有变化暂未懂,应该与V1.17相同 | V2.0.5/V2.0.4 |
V1.18 | 咱无明确说明,应该与V1.17相同 | V2.0.3/V2.0.2/V2.0.1/V2.0.0 |
V1.17 | V1.13.1/V17.03/V17.06/V17.09/ V18.06/V18.09/V19.03 | V2.0.0-rc7/V2.0.0-rc6/V2.0.0-rc5/V2.0.0-rc4 |
V1.16 | V1.13.1/V17.03/V17.06/V17.09/ V18.06/V18.09 | V2.0.0-rc3/V2.0.0-rc2/V2.0.0-rc1/ V2.0.0-beta8/V2.0.0-beta7/V2.0.0-beta6/ V2.0.0-beta5 |
V1.15 | V1.13.1/V17.03/V17.06/V17.09/ V18.06/V18.09 | V2.0.0-beta4/V2.0.0-beta3/V2.0.0-beta2 |
V1.14 | V1.13.1/V17.03/V17.06/V17.09/ V18.06/V18.09 | V2.0.0-beta1 |
V1.13 | V1.11.1/V1.12.1/V1.13.1/ V17.03/V17.06/V17.09/V18.06 | 暂时没有找到版本 |
V1.12 | V1.11.1/V1.12.1/V1.13.1/ V17.03/V17.06/V17.09/V18.06 | 暂时没有找到版本 |
V1.11 | V1.11.x/V1.12.x/V1.13.x/V17.03.x | 暂时没有找到版本 |
V1.10 | V1.11.x/V1.12.x/V1.13.x/V17.03.x | V1.10.1/V1.10.0 |
V1.9 | V1.11.x/V1.12.x/V1.13.x/V17.03.x | V1.10.1/V1.10.0/V1.8.3 |
V1.8 | V1.11.2/V1.12.6/V1.13.1/V17.03.2 | V1.10.1/V1.10.0/V1.8.3 |
查看k8s与docker版本兼容关系操作步骤:
本次搭建的k8s为1.17.0,对应的docker版本需要1.13.1、17.03、17.06、 17.09、 18.06、18.09。本地安装的docker版本为:18.06.1。
软件k8s的github地址:https://github.com/kubernetes/kubernetes,通过CHANGELOG,点击低版本的log,比如:14、15等,搜索:docker version,可以查看到当前k8s版本兼容的docker版本。
查看k8s与dashboard版本兼容关系操作步骤:
注意查看k8s兼容的dashboard版本。本次搭建的k8s版本为1.17.0,通过查看dashboard官网上不同版本的dashboard软件包能够兼容的对应k8s版本,查找到对应的dashboard版本,本次dashboard版本使用的是v2.0.0-rc7。
官网dashboard地址:https://github.com/kubernetes/dashboard/releases
9、安装docker环境:
(1)在线安装docker:
本地安装的docker版本为:18.06.1。
① 卸载旧版本docker:
执行命令:
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
② 安装依赖:
执行命令:
yum install -y yum-utils device-mapper-persistent-data lvm2
③ 配置存储仓库:
执行命令:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
④ 安装docker:
在线安装的命令为:
yum -y install docker-ce-18.06.1.ce-3.el7
(2)离线rpm安装docker:
在一个有网,并且没安装过docker的服务器上执行yum命令,将需要的相关rpm格式安装包下载到服务器指定文件夹中,以便在无网服务器中安装:
① 获取离线包:
创建rpm软件存储目录:
mkdir -p /wocloud/soft/docker_rpm
安装依赖rpm包:
yum install -y yum-utils device-mapper-persistent-data lvm2
配置存储仓库:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
获取docker的rpm包:
yum -y install docker-ce-18.06.1.ce-3.el7 --downloadonly --downloaddir /wocloud/soft/docker_rpm
其它无网服务器需要安装时,将/wocloud/soft/docker_rpm中的所有rpm文件压缩到一个包中,然后上传到目标服务器,执行下面安装命令即可。
② 上传离线包:
将获取的docker的rpm离线包上传到目标服务器。
③ 执行安装包:
进入到docker的rpm离线包的文件夹中,执行如下安装命令:
执行命令:
rpm -ivh *.rpm --force --nodeps
④ 编写docker服务脚本:
编写docker.service服务文件;
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
⑤ 上传服务脚本及授权:
将docker.service文件上传到服务器/etc/systemd/system/中,并授权:
chmod 777 /etc/systemd/system/docker.service
⑥ 重新加载系统服务:
执行命令:
systemctl daemon-reload
(3)操作docker服务:
① 开机自启docker服务:
执行命令:
systemctl enable docker
② 启动docker服务:
执行命令:
systemctl start docker
(4)修改docker的Cgroup Driver:
执行命令:
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
(5)重新启动docker:
执行命令:
systemctl daemon-reload
执行命令:
systemctl restart docker.service
10、安装kubeadm/kubelet/kubectl:
(1)简介:
Kubeadm:用来初始化集群的指令。
Kubelet:在集群中的每个节点上用来启动Pod和容器等。
Kubectl:用来与集群通信的命令行工具。
kubeadm不能帮你安装或者管理kubelet或kubectl,所以你需要 确保它们与通过kubeadm安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与kubelet间的相差一个次要版本不一致是支持的,但 kubelet 的版本不可以超过API服务器的版本。 例如,1.7.0版本的kubelet可以完全兼容1.8.0版本的API服务器,反之则不可以。
(2)官网安装教程:
官网安装教程地址:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
(3)在线安装:
① 添加阿里云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=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
EOF
② 安装安装kubeadm/kubelet/kubectl:
执行命令:
yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0
(4)离线安装:
① 安装crictl:
软件crictl是kubeadm/kubelet容器运行时接口(CRI)所需的。
软件下载:下载V1.17.0版本的crictl,与k8s版本一致,下载地址为:https://github.com/kubernetes-sigs/cri-tools/releases
软件上传:将下载的crictl软件包上传到服务器的自定义文件夹中。
软件解压:将crictl软件包进行解压。
文件移动:将crictl软件解压的crictl文件移动到/usr/bin中。
② 获取kubeadm/kubelet/kubectl离线包:
在一个有网,并且没安装过k8s的服务器上执行yum命令,将需要的相关rpm格式安装包下载到服务器指定文件夹中,以便在无网服务器中安装:
添加阿里云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=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
EOF
下载离线安装包:
创建rpm软件存储目录:
mkdir -p /wocloud/soft/kubeadm
执行命令:
yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0 --downloadonly --downloaddir /wocloud/soft/kubeadm
其它无网服务器需要安装时,将/wocloud/soft/kubeadm中的所有rpm文件压缩到一个包中,然后上传到目标服务器,执行下面安装命令即可。
③ 上传kubeadm/kubelet/kubectl离线包:
将获取的kubeadm/kubelet/kubectl离线包上传到目标服务器。
④ 执行安装包:
进入到kubeadm/kubelet/kubectl离线包的文件夹中,执行如下安装命令:
执行命令:
rpm -ivh *.rpm --force --nodeps
⑤ 编写kubelet服务脚本:
编写kubelet.service服务文件;
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/
[Service]
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10
[Install]
WantedBy=multi-user.target
⑥ 上传服务脚本及授权:
将kubelet.service文件上传到服务器/etc/systemd/system/中,并授权:
chmod 777 /etc/systemd/system/kubelet.service
⑦ 重新加载系统服务:
执行命令:
systemctl daemon-reload
(5)操作kubelet服务:
① 开启自启kubelet服务:
执行命令:
systemctl enable kubelet
11、软件k8s所需的镜像和软件版本:
通过kubeadm搭建k8s集群所需要的相关镜像和软件,与k8s版本有对应的兼容关系,查看不同版本的k8s所需要的镜像和软件版本如下操作:
软件k8s的github地址:https://github.com/kubernetes/kubernetes,通过CHANGELOG,点击低版本的log,比如:17、18等,搜索:coredns、etcd等关键词,可以查看到当前k8s版本兼容的对应镜像版本。
K8s 版本 | Coredns版本 | Etcd 版本 | api 版本 | controller 版本 | proxy 版本 | scheduler 版本 | Pause 版本 | Cri-ctl 版本 |
V1.22 | V1.8.4 | V3.5.0 | V1.22.0 | V1.22.0 | V1.22.0 | V1.22.0 | V3.5 | V1.21.0 |
V1.21 | V1.8.0 | V3.4.13 | V1.21.0 | V1.21.0 | V1.21.0 | V1.21.0 | V3.4.1 | V1.20.0 |
V1.20 | V1.7.0 | V3.4.13 | V1.20.0 | V1.20.0 | V1.20.0 | V1.20.0 | V3.4 | V1.19.0 |
V1.19 | V1.7.0 | V3.4.9 | V1.19.0 | V1.19.0 | V1.19.0 | V1.19.0 | V3.2 | V1.18.0 |
V1.18 | V1.6.7 | V3.4.3 | V1.18.0 | V1.18.0 | V1.18.0 | V1.18.0 | V3.2 | V1.17.0 |
V1.17 | V1.6.5 | V3.4.3 | V1.17.0 | V1.17.0 | V1.17.0 | V1.17.0 | V3.1 | V1.17.0 |
V1.16 | V1.6.2 | V3.3.15 | V1.16.0 | V1.16.0 | V1.16.0 | V1.16.0 | —— | V1.14.0 |
V1.15 | V1.3.1 | V3.3.10 | V1.15.0 | V1.15.0 | V1.15.0 | V1.15.0 | —— | V1.14.0 |
V1.14 | V1.3.1 | V3.3.10 | V1.14.0 | V1.14.0 | V1.14.0 | V1.14.0 | —— | —— |
V1.13 | V1.2.6 | V3.2.24 | V1.13.0 | V1.13.0 | V1.13.0 | V1.13.0 | —— | —— |
V1.12 | V1.2.2 | V3.2.24 | V1.12.0 | V1.12.0 | V1.12.0 | V1.12.0 | —— | —— |
V1.11 | V1.1.3 | V3.2.18 | V1.11.0 | V1.11.0 | V1.11.0 | V1.11.0 | —— | —— |
V1.10 | —— | V3.1.12 | V1.10.0 | V1.10.0 | V1.10.0 | V1.10.0 | V3.1 | —— |
V1.9 | —— | V3.1.10 | V1.9.0 | V1.9.0 | V1.9.0 | V1.9.0 | —— | V1.0.0 |
V1.8 | —— | —— | V1.8.0 | V1.8.0 | V1.8.0 | V1.8.0 | —— | V1.0.0 |
12、部署k8s:
(1)在线安装:
执行命令:
kubeadm init \
--apiserver-advertise-address=192.168.137.129 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.17.0 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--v=5
参数说明:
参数 | 默认值 | 参数说明 |
--apiserver-advertise-address | 默认网络接口 | API 服务器所公布的其正在监听的 IP 地址。如果未设置,则使用默认网络接口。 |
--image-repository | "k8s.gcr.io" | 选择用于拉取控制平面镜像的容器仓库。 |
--kubernetes-version | "stable-1" | 为控制平面选择一个特定的 Kubernetes 版本。 |
--service-cidr | "10.96.0.0/12" | 为服务的虚拟 IP 地址另外指定 IP 地址段 |
--pod-network-cidr | 无 | 指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs。 |
(2)离线安装:
在有网的服务器上下载k8s所需的相关镜像,将对应的镜像导出到服务器指定文件夹中,以便在无网服务器中能够导入镜像,进行使用:
① 下载k8s镜像:
从国内镜像源下载镜像:
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.17.0
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.17.0
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.17.0
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.17.0
docker pull registry.aliyuncs.com/google_containers/pause:3.1
docker pull registry.aliyuncs.com/google_containers/coredns:1.6.5
docker pull registry.aliyuncs.com/google_containers/etcd:3.4.3-0
② 导出镜像:
将修改为官方tag的镜像导入到tar压缩包中,执行命令:
docker save -o kube-proxy-v1.17.0.tar kube-proxy镜像ID registry.aliyuncs.com/google_containers/kube-proxy:v1.17.0
docker save -o kube-apiserver-v1.17.0.tar kube-apiserver镜像ID registry.aliyuncs.com/google_containers/kube-apiserver:v1.17.0
docker save -o kube-controller-manager-v1.17.0.tar kube-controller-manager镜像ID registry.aliyuncs.com/google_containers/kube-controller-manager:v1.17.0
docker save -o kube-scheduler-v1.17.0.tar kube-scheduler镜像ID registry.aliyuncs.com/google_containers/kube-scheduler:v1.17.0
docker save -o pause-3.1.tar pause镜像ID registry.aliyuncs.com/google_containers/pause:3.1
docker save -o coredns-1.6.5.tar coredns镜像ID registry.aliyuncs.com/google_containers/coredns:1.6.5
docker save -o etcd-3.4.3-0.tar etcd镜像ID registry.aliyuncs.com/google_containers/etcd:3.4.3-0
③ 导入镜像:
将上述导出的镜像包tar传输到需要的服务器上,然后通过docker命令将镜像包tar导入到docker本地仓库中,命令示例:
docker image load -i 镜像包tar文件名称
④ 检查镜像列表:
查看docker本地仓库中的镜像列表,执行命令:docker images
⑤ 部署master节点:
执行命令:
kubeadm init \
--apiserver-advertise-address=192.168.137.129 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.17.0 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--v=5
参数说明:
参数 | 默认值 | 参数说明 |
--apiserver-advertise-address | 默认网络接口 | API 服务器所公布的其正在监听的 IP 地址。如果未设置,则使用默认网络接口。 |
--image-repository | "k8s.gcr.io" | 选择用于拉取控制平面镜像的容器仓库。 |
--kubernetes-version | "stable-1" | 为控制平面选择一个特定的 Kubernetes 版本。 |
--service-cidr | "10.96.0.0/12" | 为服务的虚拟 IP 地址另外指定 IP 地址段 |
--pod-network-cidr | 无 | 指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs。 |
⑥ 查看部署结果:
出现如下提示信息,表示k8s的master节点部署好了。
(3)生成kubelet环境配置文件:
执行命令:
mkdir -p $HOME/.kube
执行命令:
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
执行命令:
sudo chown $(id -u):$(id -g) $HOME/.kube/config
(4)删除主机上train:
单机版kubernetes为了运行Pod。需要删除主机上的Train。允许master执行Pod。
执行命令:
kubectl taint nodes --all node-role.kubernetes.io/master-
13、安装pod网络插件(CNI):
(1)下载flannel的yml配置文件:
在线flannel的yml文件地址:https://github.com/caoran/kube-flannel.yml/blob/master/kube-flannel.yml,通过该地址将该yml文件下载下来。
(2)上传yml配置文件:
将yml配置文件上传到需要的服务器上。
(3)拉取flannel镜像:
执行命令:
docker pull registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64
(4)重命名flannel镜像:
执行命令:
docker tag flannel镜像ID quay.io/coreos/flannel:v0.12.0-amd64
(5)删除旧flannel镜像:
执行命令:
docker rmi registry.cn-shanghai.aliyuncs.com/leozhanggg/flannel:v0.12.0-amd64
(6)生效yml配置文件:
在需要的服务器上,进入到yml配置文件所在的文件夹中,然后执行命令进行生效:kubectl apply -f kube-flannel.yml
14、测试验证k8s:
(1)拉取nginx镜像:
手动拉取以下nginx镜像。执行命令:
docker pull nginx
(2)创建nginx容器:
执行命令:
kubectl create deployment nginx --image=nginx
(3)暴露对外端口:
执行命令:
kubectl expose deployment nginx --port=80 --type=NodePort
(4)查询nginx是否运行成功:
执行命令:
kubectl get pod,svc
(5)浏览器测试访问:
在与k8s集群通网络段的windows服务器上的浏览器中,输入k8s集群的master或node节点IP及对应nginx映射出的端口号,进行访问,正常的话是可以访问到nginx欢迎页的。
(6)扩展nginx副本:
执行命令:
kubectl scale deployment nginx --replicas=3
(7)查看pod:
通过对nginx进行了扩展副本,然后查看nginx的pod是几个,是否生效,执行命令:
kubectl get pods
更多推荐
所有评论(0)