Kubernetes集群搭建Kubeadm(二)
前言
上篇把三个节点(一个Master节点和两个Node节点)互相ping通了,也能访问网络了,现在继续搭建,并使用kubeadm搭建主节点
集群搭建
1、看看我们三个节点的IP
2、设置镜像源,使用aliyun的镜像源,并安装依赖包(以下命令都需要在3个节点执行)
yum -y install wget # 安装wget wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 使用阿里云镜像 yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables cur sysstat libseccomp wget vim net-tools git # 安装依赖包
3、关闭防火墙,并为Iptables设置空规则
因为我们不需要用到,就自己使用,而且防火墙可能会阻止docker
# 关闭防火墙并设置不再自启
systemctl stop firewalld && systemctl disable firewalld
# 配置iptables规则 yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
4、关闭SELINUX
主要是k8s会去检测swap分区,可能导致pod在虚拟内存运行,降低工作效率
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
5、调整k8s的内核参数
cat > kubernetes.conf <<EOF net.bridge.bridge-nf-call-iptables=1 # 开启网桥模式 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 net.ipv4.tcp_tw_recycle=0 vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM时才允许使用它 vm.overcommit_memory=1 # 不检查物理内存是否够用 vm.panic_on_oom=0 # 开启 OOM fs.inotify.max_user_instances=8192 fs.inotify.max_user_watches=1048576 fs.file-max=52706963 fs.nr_open=52706963 net.ipv6.conf.all.disable_ipv6=1 # 关闭ipv6 net.netfiler.nf_conntrack_max=2310720 EOF
# 将Kubernete.conf 复制到/etc/sysctl.d目录下 cp kubernetes.conf /etc/sysctl.d/kubernetes.conf sysctl -p /etc/sysctl.d/kubernetes.conf
提示没有文件或目录,不用管他,后面centos内核到4.4就好了
6、关闭系统不需要的服务
systemctl stop postfix && systemctl disable postfix
7、设置rsyslogd和systemd journald
mkdir /var/log/journal # 持久化保存日志的目录 mkdir /etc/systemd/journald.conf.d cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF [Journal] # 持久化保存到磁盘 Storage=persistent # 压缩历史日志 Compress=yes SyncIntervalSec=5m RateLimitInterval=30s RateLimitBurst=1000 # 最大占用空间 10G SystemMaxUse=10G # 单日志文件最大 200M SystemMaxFileSize=200M # 日志保存时间 2 周 MaxRetentionSec=2week # 不将日志转发到 syslog ForwardToSyslog=no EOF systemctl restart systemd-journald
8、升级系统内核为4.4
因为CentOS7 版本中自带3.*内核存在一些bugs,会导致运行的docker、Kubernetes不稳定
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm # 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry中是否包含 initrd16配置,如果没有,再安装一次。 yum --enablerepo=elrepo-kernel install -y kernel-lt # 设置开机从新内核启动 grub2-set-default "CentOS Linux (4.4.241-1.el7.elrepo.x86_64) 7 (Core)" # 重启 reboot
重启完使用uname -r 去检测,就可以看到自动启用了4.4内核的版本
9、配置kube-proxy开启ipvs,用于解决svc和pod的调度关系,增加访问效率
modprobe br_netfilter # 以下内容写到ipvs.modules中 cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF # 使用chmod 给权限 chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
10、安装Docker
# yum 安装docker需要的工具 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加镜像源 yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum update -y && yum install -y docker-ce # 重启 reboot # 此处需要重启配置启动Centos7系统的4.4内核,因为失效了,需要重新配置一次,以后就不会了 grub2-set-default "CentOS Linux (4.4.241-1.el7.elrepo.x86_64) 7 (Core)" # 启动dokcer systemctl start docker && systemctl enable docker ## 创建 /etc/docker 目录 mkdir /etc/docker # 配置daemon cat > /etc/docker/daemon.json <<EOF { "exec-opts":["native.cgroupdriver=systemd"], "log-driver":"json-file", "log-opts":{ "max-size":"100m" } } EOF # 创建目录,存放docker的配置文件 mkdir -p /etc/systemd/system/docker.service.d # 重启docker服务 systemctl daemon-reload && systemctl restart docker && systemctl enable docker
安装260m左右,还是挺大的,安装后等重启,重启配置一下内核启动,接着配置daemon.json文件,并设置docker开机自启等工作。
11、安装kubeadm,实现主从配置
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF # 安装kubeadm yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1 # 设置开机自启 systemctl enable kubelet.service
安装完后设置kubelet.service开机自启
12、使用kubeadm安装包安装
由于kubeadm init需要的镜像很多,所以先拿别人下载好的镜像包来玩,少踩点坑,用的是1.15.1,后面再去搞搞最新的,我放百度云了
链接:https://pan.baidu.com/s/1pnphP8JA7mWx693-Mw9G7w
提取码:esh8
安装拖曳文件的命令
yum -y install lrzsz
将文件拖入到/root/路径下
# 解压 tar -zxvf kubeadm-basic.images.tar.gz # 查看文件 ls
解压出来的文件还需要在解压,而且其他节点也需要用到,就写个脚本load-images.sh执行
vi load-images.sh #!/bin/bash # 查询kubeadm-basic.images文件夹下的文件,并写入到临时文件里面 ls /root/kubeadm-basic.images > /tmp/image-list.txt cd /root/kubeadm-basic.images # 遍历kubeadm-basic.images下的文件,并解压 for i in $( cat /tmp/image-list.txt ) do docker load -i $i done # 删除临时文件 rm -rf /tmp/image-list.txt
# 并赋予权限 chmod a+x load-images.sh # 执行脚本 ./load-images.sh
其他两个node节点也要哦,可以把kubeadm-basic.images文件夹和load-images.sh文件copy过去,并执行./load-images.sh命令
scp -r kubeadm-basic.images load-images.sh root@k8s-node01:/root/ scp -r kubeadm-basic.images load-images.sh root@k8s-node02:/root/ # 并分别在node01和node02节点上执行命令 ./load-images.sh
13、初始化主节点(这一步只需要在Master上操作)
# 打印初始化信息到kubeadm-config.yaml 需要修改里面的配置信息 kubeadm config print init-defaults > kubeadm-config.yaml # 查看文件 ls
# 编辑改文件,需要改ip等信息
vim kubeadm-config.yaml
[root@k8s-master01 ~]# cat kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta2 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.168.81.110 bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock name: k8s-master01 taints: - effect: NoSchedule key: node-role.kubernetes.io/master --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: type: CoreDNS etcd: local: dataDir: /var/lib/etcd imageRepository: k8s.gcr.io kind: ClusterConfiguration kubernetesVersion: v1.15.1 networking: dnsDomain: cluster.local podSubnet: "10.244.0.0/16" serviceSubnet: 10.96.0.0/12 scheduler: {} --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration featureGates: SupportIPVSProxyMode: true mode: ipvs
如上图,改了这几处,ip就选自己的,其他不变
切记,这里需要配置了/etc/hosts 文件,不然会失败的
# 开始初始化主节点,并加执行产生的日志写入到kubeadm-init.log中,需要用到的 kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
# 查看日志
cat kubeadm-init.log
加入主节点以及其他节点
# 执行安装日志中的加入命令即可。 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
将我们的kubeadm-init.log kubeadm-config.yaml 文件放置到别的路径下,不要放在root上,以防被删除,并创建flannel目录,用来部署网络
mkdir install-k8s mv kubeadm-init.log kubeadm-config.yaml install-k8s/ cd install-k8s mkdir core mv * core/ mkdir plugin cd plugin/ mkdir flannel cd flannel/
14、部署网络,使用flannel
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
创建kube-flannel(这里有个坑,查看kube-flannel.yml后会发现有个quay.io域名下的镜像,如果不能访问国外网络是无法使用的,因为我这边能访问,所以执行成功,看到网上执行失败的是改了别人的镜像操作的)
kubectl create -f kube-flannel.yml
# 查看pod状态 kubectl get pod -n kube-system -o wide
kube-flannel下的Pod就运行起来了,不然会出现Init(0/1)的状态
因此,我们的Master节点就部署完成了,接下来就是让我们的Node节点加入到Master节点上,刚才查看的kubeadm-init.log,最后一句命令就是使Node节点加入Master集群中
在Node节点上分别执行
kubeadm join 192.168.81.110:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:dfc8c90375edce13d20fe81f3d78380940f6a6d2356b05729d13c163c4b72b3f
# Node节点加入之后,继续查看pod状态 kubectl get pod -n kube-system -o wide
Node节点已经就加入啦,这样,我们的集群就ok了
15、使用Kubectl Deployment来运行一个Pod
# 创建3个副本 kubect run nginx-deployment --image=nginx:latest --port=80 --replicas=3 # 查看deployment状态 kubectl get deployment # 查看rs kubectl get rs # 查看pod,会发现运行在了不同的节点上啦 kubect get pod -o wide
总结
本篇挺长的,也顺利运行起来了,下篇讲讲私有仓库搭建。