主机规划
主机名 |
IP地址 |
操作系统 |
配置 |
Master |
192.168.0.230 |
Centos 7.6 |
2核2g |
Note1 |
192.168.0.231 |
Centos 7.6 |
1核1g |
Note2 |
192.168.0.232 |
Centos 7.6 |
1核1g |
参考链接:https://www.cnblogs.com/QIzhu/p/16627539.html
集群环境准备
以下环境配置需在三台主机都要执行:
1.关闭防火墙并设置防火墙随机不自启
kubernetes和docker在运行中会产生大量防火墙规则)
systemctl stop firewalld && systemctl disable firewalld
2.关闭SELinux系统内核安全机制
#临时关闭 setenforce 0
#永久关闭 vi /etc/selinux/config SELINUX=disabled
3.配置本地yum源
4.配置本地主机名与IP地址解析
为了后面对集群节点的调用,企业中推荐使用内部DNS服务器)
[root@master ~]# vim /etc/hosts
192.168.0.230 master
192.168.0.231 node1
192.168.0.232 node2
5.配置时间同步,保证每一个节点时间一致
#安装时间同步服务
yum -y install chrony
#启动chronyd
systemctl start chronyd && systemctl enable chronyd
#查看时间
[root@master ~]# date
6.禁用swap交换分区
kubernetes强制要求禁用
#修改/etc/fstab文件,注释掉swap自动挂载一行即可,修改后需要重启系统生效,这一步可放在最后环境
配置后一起重启
vim /etc/fstab
...
#/dev/mapper/centos-swap swap swap defaults 0 0
7.修改Linux内核参数,添加网桥过滤器和地址转发功能
#编辑/etc/sysctl.d/kubernetes.conf文件添加如下配置(该文件默认不存在)
vim /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
#重新加载配置
sysctl -p
#加载网桥过滤器模块
modprobe br_netfilter
#查看网桥过滤器模块是否加载成功
lsmod | grep br_netfilter
br_netfilter 22256 0bridge 151336 1 br_netfilter
8.配置ipvs功能
kubernetes中Service有两种代理模型,一种是基于iptables的,一种是基于ipvs,
两者对比ipvs的性能要高,如果想要使用ipvs模型,需要手动载入ipvs模块
#安装ipset和ipvsadm软件
yum -y install ipset ipvsadm
#添加需要加载的模块写入脚本文件
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
#设置脚本权限
chmod +x /etc/sysconfig/modules/ipvs.modules
#执行脚本
/etc/sysconfig/modules/ipvs.modules
#查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
nf_conntrack_ipv4 15053 0
nf_defrag_ipv4 12729 1 nf_conntrack_ipv4
ip_vs_sh 12688 0
ip_vs_wrr 12697 0
ip_vs_rr 12600 0
ip_vs 145497 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 133095 2 ip_vs,nf_conntrack_ipv4
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
#重新启动系统
reboot
#检查SELinux是否关闭
getenforce //显示Disabled
#检查swap分区是否关闭
free -h
9.安装docker、kubeadm、kubelet、kubectl程序
//三台主机都需要安装
#创建阿里Base源与epel源用于安装依赖包
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#生成yum缓存提高软件下载速度[root@master ~]# yum makecache
#安装yum-utils软件用于提供yum-config-manager程序
yum install -y yum-utils
#使用yum-config-manager创建docker存储库(阿里)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#查看当前镜像源中支持的docker版本
yum list docker-ce --showduplicates
docker-ce-18.06.3.ce-3.el7 #该版本为特定版
#安装特定版docker-ce,安装时需要使用--setopt=obsoletes=0参数指定版本,否则yum会自动安装高版本
yum -y install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7
#查看docker版本信息
docker --version
#创建/etc/docker目录,并在/etc/docker目录下添加一个配置文件
mkdir /etc/docker
#Docker默认使用的Cgroup Driver为默认文件驱动,而k8s默认使用的文件驱动为systemd,k8s要求驱动类型必须要一致,所以需要将docker文件驱动改成systemd
cat <<EOF > /etc/docker/daemon.json
{
"registry-mirrors": ["https://aoewjvel.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
#启动docker程序
systemctl start docker && systemctl enable docker
10.安装kubernetes程序
#创建阿里kubernetes仓库
cat <<EOF > /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
EOF
#查看仓库可用软件包
yum repolist
#生成yum缓存提高软件下载速度
yum makecache
#安装kubeadm、kubelet、kubectl程序
yum -y install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0
#配置kubelet的cgroup,编辑/etc/sysconfig/kubelet文件
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBELET_PROXY_MODE="ipvs"
#设置kubelet随机自启
systemctl enable kubelet
11.下载集群镜像
#在安装kubernetes集群前,必须要准备好集群需要的镜像,所需的镜像可以通过下面命令查看
#kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.17.4
k8s.gcr.io/kube-controller-manager:v1.17.4
k8s.gcr.io/kube-scheduler:v1.17.4
k8s.gcr.io/kube-proxy:v1.17.4
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
#定义镜像列表,应为此镜像在kubernetes仓库中,由于网络原因无法下载,下面提供了一种替代方案
images=(
kube-apiserver:v1.17.4
kube-controller-manager:v1.17.4
kube-scheduler:v1.17.4
kube-proxy:v1.17.4
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
#从阿里镜像仓库下载镜像
for imageName in ${images[@]};do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
#查看镜像(标签以变成k8s标签)
#docker images
REPOSITORY
k8s.gcr.io/kube-proxy
k8s.gcr.io/kube-scheduler
k8s.gcr.io/kube-apiserver
k8s.gcr.io/kube-controller-manager
k8s.gcr.io/coredns
k8s.gcr.io/etcd
k8s.gcr.io/pause
集群初始化
Master节点创建集群(该操作只在master主机执行)
# kubeadm init \
--kubernetes-version=v1.17.4 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=192.168.0.230 (控制节点IP)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
node节点加入集群
kubeadm join 192.168.0.230:6443 --token k0iymj.1vmpqlws0bfk8iaw \
--discovery-token-ca-cert-hash sha256:376d1e7633a2f7b9a9c6ccdaba165c3079966aca9ada6b63affaef500dd87958
kubeadm join 192.168.0.230:6443 --token k0iymj.1vmpqlws0bfk8iaw \
--discovery-token-ca-cert-hash sha256:376d1e7633a2f7b9a9c6ccdaba165c3079966aca9ada6b63affaef500dd87958
master节点查看node节点信息
kubectl get nodes
安装网络插件
kubernetes支持多种网络插件,如:flflannel、calico、canal等,任选一种使用即可,本次部署选择 flflannel 只在master节点安装flflannel插件即可,该插件使用的是DaemonSet控制器,该控制器会在每个节点上都运行
#获取flannel配置文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#执行文件启动flannel
kubectl apply -f kube-flannel.yml
#查看nodes节点信息
kubectl get nodes
集群环境测试
在kubenetes集群中部署一个nginx程序测试集群是否能正常工作
#部署nginx程序
[root@master ~]# kubectl create deployment nginx --image=nginx:1.18-alpine
#开放端口
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
#查看pod状态
[root@master ~]# kubectl get pod
#查看service状态
[root@master ~]# kubectl get service
#访问测试
http://192.168.0.230:31813/