更多内容,请查看博客原文:通过kubeadm离线安装k8s集群v1.15
安装说明
这篇文章将描述在生产环境中,如何搭建k8s集群。
为什么使用kubeadm
来安装
kubeadm
是官方社区推出的一个用于快速部署kubernetes集群的工具。这个工具能通过两条指令快速完成一个kubernetes集群的部署。
网上很多人说通过二进制安装能了解到配置的细节,其实通过kubeadm
安装也能查看到配置的细节。
可以自动生成证书,对初学者带来了不少便利。
网络环境
我们完全模拟生产环境中,不可以访问外部互联网的情况。
基础的yum源是有提供的,像什么docker-ce、kubernetes的源是没有的。
k8s.gcr.io、quay.io这些域名也是不可以访问的。
准备环境
如果没有特殊提及,安装及操作需要在所有master及node节点上执行。
机器网络及配置
复制三台虚拟机。
主机名 | IP | 节点类型 | 最低配置 |
---|---|---|---|
k8s-master | 172.16.64.233 | master节点 | CPU 2Core, Memory 1GB |
k8s-node1 | 172.16.64.232 | node节点 | CPU 1Core, Memory 1GB |
k8s-node2 | 172.16.64.235 | node节点 | CPU 1Core, Memory 1GB |
master节点需要至少2个CPU,不然会报如错误:
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
关闭selinux
把SELINUX=enforcing
替换成SELINUX=disabled
sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
setenforce 0
查看一下selinux的状态。
getenforce
Permissive
关闭Swap
swapoff -a
cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak | grep -v swap > /etc/fstab
grep -v swap
是查找不包含swap
的行。
查看一下swap的情况,Swap已经全部为0了。
free -m
total used free shared buff/cache available
Mem: 972 142 715 7 114 699
Swap: 0 0 0
设置主机名
在master节点上设置主机名。
hostnamectl set-hostname k8s-master
在node1节点上设置主机名。
hostnamectl set-hostname k8s-node1
在node2节点上设置主机名。
hostnamectl set-hostname k8s-node2
在master上查看主机名。
hostname
k8s-master
设置hosts
>>表示文件末尾追加记录。
cat >> /etc/hosts <<EOF
172.16.64.233 k8s-master
172.16.64.232 k8s-node1
172.16.64.235 k8s-node2
EOF
修改sysctl.conf
暂时未修改,装docker的时候会自动修改。可以暂时先跳过这一步。
如果未修改成功,在执行docker info
命令时,会显示如下提示信息。
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
cat /proc/sys/net/bridge/bridge-nf-call-iptables
0
cat /proc/sys/net/bridge/bridge-nf-call-ip6tables
0
可通过以下方法来做修改。
# 修改 /etc/sysctl.conf
# 如果有配置,则修改
sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g" /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g" /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g" /etc/sysctl.conf
# 可能没有,追加
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
sysctl -p
安装Docker
下载docker
由于我们在生产环境中是没法连接互联网的,所以要提前准备好docker rpm包。
我们在另一台可以联网的机器上下载安装所需的软件。
添加docker yum源
在联网的机器上,下载docker
配置docker-ce源
cd /etc/yum.repos.d/
wget https://download.docker.com/linux/centos/docker-ce.repo
查看docker所有版本
yum list docker-ce --showduplicates
...
docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
...
我们选择安装docker-ce.18.06.3.ce-3.el7
下载
yum install --downloadonly --downloaddir ~/k8s/docker docker-ce-18.06.3.ce-3.el7
docker及其依赖会下载到~/docker文件夹中。
我们可以看到只有docker-ce
是来自docker-ce-stable
源的。
===============================================================================================================
Package 架构 版本 源 大小
===============================================================================================================
正在安装:
docker-ce x86_64 18.06.3.ce-3.el7 docker-ce-stable 41 M
为依赖而安装:
audit-libs-python x86_64 2.8.5-4.el7 base 76 k
checkpolicy x86_64 2.5-8.el7 base 295 k
container-selinux noarch 2:2.107-3.el7 extras 39 k
libcgroup x86_64 0.41-21.el7 base 66 k
libseccomp x86_64 2.3.1-3.el7 base 56 k
libsemanage-python x86_64 2.5-14.el7 base 113 k
libtool-ltdl x86_64 2.4.2-22.el7_3 base 49 k
policycoreutils-python x86_64 2.5-33.el7 base 457 k
python-IPy noarch 0.75-6.el7 base 32 k
setools-libs x86_64 3.3.8-4.el7 base 620 k
所以,我们只需要把docker-ce-18.06.3.ce-3.el7.x86_64.rpm
拷贝到master及node节点里面。
在master及node节点里创建~/k8s/docker
目录,用于存放docker安装rpm包。
mkdir -p ~/k8s/docker
拷贝到k8s集群
通过scp命令拷贝。
scp docker-ce-18.06.3.ce-3.el7.x86_64.rpm root@172.16.64.233:~/k8s/docker/
scp docker-ce-18.06.3.ce-3.el7.x86_64.rpm root@172.16.64.232:~/k8s/docker/
scp docker-ce-18.06.3.ce-3.el7.x86_64.rpm root@172.16.64.235:~/k8s/docker/
安装Docker
yum本地安装
yum install k8s/docker/docker-ce-18.06.3.ce-3.el7.x86_64.rpm
设置开机启动
systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
我们可以查看一下安装包到底生成了哪些文件。
rpm -ql docker-ce
或者
rpm -qpl k8s/docker/docker-ce-18.06.3.ce-3.el7.x86_64.rpm
启动Docker
systemctl start docker
查看docker服务信息。
docker info
...
Cgroup Driver: cgroupfs
...
呆会儿我们还需要修改这个值。
安装k8s组件
由于kubeadm是依赖kubelet, kubectl的,所以我们只需要下载kubeadm的rpm,其依赖就自动下载下来了。但是版本可能不是我们想要的,所以可能需要单独下载。比如我下载kubeadm-1.15.6,它依赖的可能是kubelet-1.16.x。
下载k8s组件
我们需要安装kubeadm, kubelet, kubectl,版本需要一致。在可以连外网的机器上下载组件,同上面docker。
添加kubernetes yum源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
enabled=1
EOF
查看kubeadm版本
yum list kubeadm --showduplicates
kubeadm.x86_64 1.15.6-0 kubernetes
下载
下载kubeadm-1.15.6
yum install --downloadonly --downloaddir ~/k8s/kubernetes kubeadm-1.15.6
根据如下依赖关系
====================================================================================================================================================
Package 架构 版本 源 大小
====================================================================================================================================================
正在安装:
kubeadm x86_64 1.15.6-0 kubernetes 8.9 M
为依赖而安装:
conntrack-tools x86_64 1.4.4-5.el7_7.2 updates 187 k
cri-tools x86_64 1.13.0-0 kubernetes 5.1 M
kubectl x86_64 1.16.3-0 kubernetes 10 M
kubelet x86_64 1.16.3-0 kubernetes 22 M
kubernetes-cni x86_64 0.7.5-0 kubernetes 10 M
libnetfilter_cthelper x86_64 1.0.0-10.el7_7.1 updates 18 k
libnetfilter_cttimeout x86_64 1.0.0-6.el7_7.1 updates 18 k
libnetfilter_queue x86_64 1.0.2-2.el7_2 base 23 k
socat x86_64 1.7.3.2-2.el7 base 290 k
我们只需要把来自kubernetes
源的kubeadm
和4个依赖cri-tools
, kubectl
, kubelet
和kubernetes-cni
拷贝到master和node节点。
下载kubelet-1.15.6
yum install --downloadonly --downloaddir ~/k8s/kubernetes kubelet-1.15.6
下载kubectl-1.15.6
yum install --downloadonly --downloaddir ~/k8s/kubernetes kubectl-1.15.6
拷贝到k8s集群
在master及node节点里创建~/k8s/kubernetes
目录,用于存放k8s组件安装的rpm包。
mkdir -p ~/k8s/kubernetes
kubeadm
cri-tools
scp 14bfe6e75a9efc8eca3f638eb22c7e2ce759c67f95b43b16fae4ebabde1549f3-cri-tools-1.13.0-0.x86_64.rpm root@172.16.64.233:~/k8s/kubernetes/
scp 14bfe6e75a9efc8eca3f638eb22c7e2ce759c67f95b43b16fae4ebabde1549f3-cri-tools-1.13.0-0.x86_64.rpm root@172.16.64.232:~/k8s/kubernetes/
scp 14bfe6e75a9efc8eca3f638eb22c7e2ce759c67f95b43b16fae4ebabde1549f3-cri-tools-1.13.0-0.x86_64.rpm root@172.16.64.235:~/k8s/kubernetes/
kubectl
scp 5181c2b7eee876b8ce205f0eca87db2b3d00ffd46d541882620cb05b738d7a80-kubectl-1.15.6-0.x86_64.rpm root@172.16.64.233:~/k8s/kubernetes/
scp 5181c2b7eee876b8ce205f0eca87db2b3d00ffd46d541882620cb05b738d7a80-kubectl-1.15.6-0.x86_64.rpm root@172.16.64.232:~/k8s/kubernetes/
scp 5181c2b7eee876b8ce205f0eca87db2b3d00ffd46d541882620cb05b738d7a80-kubectl-1.15.6-0.x86_64.rpm root@172.16.64.235:~/k8s/kubernetes/
kubelet
scp e9e7cc53edd19d0ceb654d1bde95ec79f89d26de91d33af425ffe8464582b36e-kubelet-1.15.6-0.x86_64.rpm root@172.16.64.233:~/k8s/kubernetes/
scp e9e7cc53edd19d0ceb654d1bde95ec79f89d26de91d33af425ffe8464582b36e-kubelet-1.15.6-0.x86_64.rpm root@172.16.64.232:~/k8s/kubernetes/
scp e9e7cc53edd19d0ceb654d1bde95ec79f89d26de91d33af425ffe8464582b36e-kubelet-1.15.6-0.x86_64.rpm root@172.16.64.235:~/k8s/kubernetes/
kubernetes-cni
scp 548a0dcd865c16a50980420ddfa5fbccb8b59621179798e6dc905c9bf8af3b34-kubernetes-cni-0.7.5-0.x86_64.rpm root@172.16.64.235:~/k8s/kubernetes/
安装k8s组件
yum install ~/k8s/kubernetes/*.rpm
这样,kubeadm, kubectl, kubelet就已经安装好了。
设置kubelet的开机启动。我们并不需要启动kubelet,就算启动,也是不能成功的。执行kubeadm命令,会生成一些配置文件 ,这时才会让kubelet启动成功的。
systemctl enable kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
拉取镜像
执行kubeadm时,需要用到一些镜像,我们需要提前准备。
查看需要依赖哪些镜像
kubeadm config images list
W1207 18:53:23.129020 10255 version.go:98] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get https://dl.k8s.io/release/stable-1.txt: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
W1207 18:53:23.129433 10255 version.go:99] falling back to the local client version: v1.15.6
k8s.gcr.io/kube-apiserver:v1.15.6
k8s.gcr.io/kube-controller-manager:v1.15.6
k8s.gcr.io/kube-scheduler:v1.15.6
k8s.gcr.io/kube-proxy:v1.15.6
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1
在生产环境,是肯定访问不了k8s.gcr.io这个地址的。在有大陆联网的机器上,也是无法访问的。所以我们需要使用国内镜像先下载下来。
镜像地址,请参考 {% post_link K8S国内的镜像源 %}
拉取镜像
在三台机器上拉取如下镜像。
docker pull gcr.azk8s.cn/google-containers/kube-apiserver:v1.15.6
docker pull gcr.azk8s.cn/google-containers/kube-controller-manager:v1.15.6
docker pull gcr.azk8s.cn/google-containers/kube-scheduler:v1.15.6
docker pull gcr.azk8s.cn/google-containers/kube-proxy:v1.15.6
docker pull gcr.azk8s.cn/google-containers/pause:3.1
docker pull gcr.azk8s.cn/google-containers/etcd:3.3.10
docker pull gcr.azk8s.cn/google-containers/coredns:1.3.1
查看拉取镜像。
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gcr.azk8s.cn/google-containers/kube-proxy v1.15.6 d756327a2327 3 weeks ago 82.4MB
gcr.azk8s.cn/google-containers/kube-apiserver v1.15.6 9f612b9e9bbf 3 weeks ago 207MB
gcr.azk8s.cn/google-containers/kube-controller-manager v1.15.6 83ab61bd43ad 3 weeks ago 159MB
gcr.azk8s.cn/google-containers/kube-scheduler v1.15.6 502e54938456 3 weeks ago 81.1MB
gcr.azk8s.cn/google-containers/coredns 1.3.1 eb516548c180 10 months ago 40.3MB
gcr.azk8s.cn/google-containers/etcd 3.3.10 2c4adeb21b4f 12 months ago 258MB
gcr.azk8s.cn/google-containers/pause 3.1 da86e6ba6ca1 23 months ago 742kB
tag镜像
为了让kubeadm程序能找到k8s.gcr.io
下面的镜像,需要把刚才下载的镜像名称重新打一下tag。
docker images | grep gcr.azk8s.cn/google-containers | sed 's/gcr.azk8s.cn\/google-containers/k8s.gcr.io/' | awk '{print "docker tag " $3 " " $1 ":" $2}' | sh
删除旧的镜像,当然,你留着也不会占用太多空间。
docker images | grep gcr.azk8s.cn/google-containers | awk '{print "docker rmi " $1 ":" $2}' | sh
查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/kube-proxy v1.15.6 d756327a2327 3 weeks ago 82.4MB
k8s.gcr.io/kube-apiserver v1.15.6 9f612b9e9bbf 3 weeks ago 207MB
k8s.gcr.io/kube-controller-manager v1.15.6 83ab61bd43ad 3 weeks ago 159MB
k8s.gcr.io/kube-scheduler v1.15.6 502e54938456 3 weeks ago 81.1MB
k8s.gcr.io/coredns 1.3.1 eb516548c180 10 months ago 40.3MB
k8s.gcr.io/etcd 3.3.10 2c4adeb21b4f 12 months ago 258MB
k8s.gcr.io/pause 3.1 da86e6ba6ca1 23 months ago 742kB
镜像搞定了。
更多内容,请查看博客原文:通过kubeadm离线安装k8s集群v1.15