安装环境准备
1主2从总共三台虚拟机(虚拟机分配内核个数至少为二)
ip | hostname | 备注 |
192.168.66.100 | k8s-master | master节点 |
192.168.66.101 | k8s-node1 | node1 |
192.168.66.102 | k8s-node2 | node2 |
操作系统如下
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
分别在各节点修改虚拟机主机名
[root@localhost ~]# hostname k8s-master
[root@localhost ~]# hostname k8s-node1
[root@localhost ~]# hostname k8s-node2
同时配置hosts文件
vim /etc/hosts
#添加以下配置
192.168.66.100 k8s-master
192.168.66.101 k8s-node1
192.168.66.102 k8s-node2
关闭防火墙
#停止当前防火墙服务
systemctl stop firewalld.service
#禁用防火墙启动
systemctl disable firewalld.service
#查看防火墙状态
firewall-cmd --state
关闭selinux
#关闭当前selinux服务
setenforce 0
#修改selinux配置文件,防止重启后再次开启
vi /etc/selinux/config
SELINUX=disabled
桥接网络配置
modprobe br_netfilter
vim /etc/sysctl.d/k8s.conf #新建k8s.conf文件,并添加以下内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#执行修改的桥接网络设置
sysctl -p /etc/sysctl.d/k8s.conf
ls /proc/sys/net/bridge
#输出以下内容
bridge-nf-call-arptables bridge-nf-call-iptables bridge-nf-filter-vlan-tagged
bridge-nf-call-ip6tables bridge-nf-filter-pppoe-tagged bridge-nf-pass-vlan-input-dev
关闭swap
Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动。可以通过kubelet的启动参数–fail-swap-on=false更改这个限制。
#关闭当前swap
swapoff -a
vi /etc/fstab
#注释掉下面一行关于swap的配置
/dev/mapper/centos-swap swap swap defaults 0 0
#确认swap是否正确关闭
free -m
swap显示为0则正确配置
#k8s的swappiness参数调整,修改配置文件
vi /etc/sysctl.d/k8s.conf
#添加如下内容
vm.swappiness=0
#使修改生效
sysctl -p /etc/sysctl.d/k8s.conf
至此,安装环境的准备基本完成。为了省事,关闭防火墙、selinux、swap等操作也可直接执行以下脚本
# 所有主机:基本系统配置
# 关闭Selinux/firewalld
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 关闭交换分区
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab
# 设置网桥包经IPTables,core文件生成路径
echo """
vm.swappiness = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
""" > /etc/sysctl.conf
sysctl -p
# 同步时间
yum install -y ntpdate
ntpdate -u ntp.api.bz
安装docker和kubernetes
下面开始安装docker和k8s,由于官方文档也并未明确指出docker和kubernetes的兼容版本要求,此次安装版本均采用最新的(docker-ce-18.09.3和kubernetes-v1.14.0),由于网络原因,安装时均配置了国内阿里yum源,安装时如果不指定版本则默认安装最新版。
docker安装
#安装yum操作的基本服务,如果已安装可跳过此步骤
yum install -y net-tools epel-release
yum install -y vim yum-utils device-mapper-persistent-data lvm2
#添加阿里云的docker-ce源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#查看docker可安装版本
yum list docker-ce.x86_64 --showduplicates |sort -r
#安装docker如果不指定版本则会安装最新可安装版本
yum install docker-ce<-指定版本>
#设置开机启动
systemctl enable docker
#启动服务
systemctl start docker
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=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
#yum命令安装
yum install kubectl<-指定版本> kubelet<-指定版本> kubernetes-cni<-指定版本> kubeadm<-指定版本>
#设置开机启动
systemctl enable kubelet.service
调整启动方式
kubelet的启动环境变量要与docker的cgroup-driver驱动相同如果不一致,后续启动时报错
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".
查看docker的cgroup-driver
docker info或者docker info | grep -i cgroup
#找到Cgroup Driver相关内容
Cgroup Driver: cgroupfs
官方推荐处理方式(修改docker的相关配置)
#Setup daemon.
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# Restart Docker
systemctl daemon-reload
systemctl restart docker
安装kubernetes相关组件
如果网络允许的话,也可直接使用kubeadm config images pull命令直接从谷歌拉取镜像到本地,前提是上网的梯子足够好。本文才去拉取国内阿里云仓库镜像的方式,省钱省力。
利用kubeadm命令查看当前kubernetes需要的镜像
kubeadm config images list
#显示以下内容
k8s.gcr.io/kube-apiserver:v1.14.0
k8s.gcr.io/kube-controller-manager:v1.14.0
k8s.gcr.io/kube-scheduler:v1.14.0
k8s.gcr.io/kube-proxy:v1.14.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1
制作拉取脚本并将脚本修改为需要的tag名称,随后删除无用的镜像
#!/bin/bash
KUBE_VERSION=v1.14.0
KUBE_PAUSE_VERSION=3.1
ETCD_VERSION=3.3.10
DNS_VERSION=1.3.1
username=registry.cn-hangzhou.aliyuncs.com/google_containers
images=(
kube-proxy-amd64:${KUBE_VERSION}
kube-scheduler-amd64:${KUBE_VERSION}
kube-controller-manager-amd64:${KUBE_VERSION}
kube-apiserver-amd64:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd-amd64:${ETCD_VERSION}
coredns:${DNS_VERSION}
)
for image in ${images[@]}
do
NEW_IMAGE=`echo ${image}|awk '{gsub(/-amd64/,"",$0);print}'`
echo ${NEW_IMAGE}
docker pull ${username}/${image}
docker tag ${username}/${image} k8s.gcr.io/${NEW_IMAGE}
docker rmi ${username}/${image}
done
接下来就可以初始化master节点了(仅master节点执行)
# --token-ttl 0 默认token的有效期为24小时,当过期之后,该token就不可用了,需要重新生成token,此处设置为永不过期
# --pod-network-cidr=10.244.0.0/16,选择flannel作为Pod网络插件
kubeadm init --kubernetes-version=v1.14.0 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.66.100 --token-ttl 0 --ignore-preflight-errors=Swap
//记录输出内容,添加节点时会用到token信息
kubeadm join 192.168.66.100:6443 --token n0kt4i.i60jw3d7veicguux \
--discovery-token-ca-cert-hash sha256:ef6c423dd699d3a0cd0620ba466573d9764f59d038377fc02e23cd71cd67034f
初始化时如果报错:
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1 [ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1 [preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
解决办法:根据提示修改相关配置即可
echo "1" >/proc/sys/net/ipv4/ip_forward echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables #修改配置后重启kubernetes服务 systemctl restart kubelet.service
为了在节点上可以使用kubectl命令,也可做以下设置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
配置flannel网络(仅主节点执行)
网络原因会出现拒绝连接的情况,重试几次即可
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
添加子节点(子节点上执行)
使用master节点初始化成功时输出的内容执行加入集群的动作
kubeadm join 192.168.66.100:6443 --token n0kt4i.i60jw3d7veicguux \
--discovery-token-ca-cert-hash sha256:ef6c423dd699d3a0cd0620ba466573d9764f59d038377fc02e23cd71cd67034f
以上操作均成功后,及完成了kubernetes的集群安装
查看节点信息
kubectl get nodes
#输出如下内容
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 24h v1.14.0
k8s-node1 Ready <none> 23h v1.14.0
k8s-node2 Ready <none> 23h v1.14.0