三、 集群安装
K8S构建1台master2台node+Harbor
部署环境:master、node:centos7虚拟机
准备文件:kubeadm-basic.images.tar.gz(需要文件留评论我会发给你)
注:我是在openstack云平台创建了三台虚拟机,如果你们没有资源,使用的是vmware进行创建,请看我其他教程,我会讲解如何创建自己的虚拟机。
master01网络配置(其他节点配置大同小异):
node01: 192.223.42.38
node02: 192.223.42.39
设置主机名:分别在三台虚拟机内
hostnamectl set-hostname master01 hostnamectl set-hostname node01 hostnamectl set-hostname node02
以下操作三台虚拟机都需要执行
各节点配置:
echo "192.223.42.26 master01 192.223.42.38 node01 192.223.42.39 node02" >> /etc/hosts
安装依赖包:
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
设置防火墙为 Iptables 并设置空规则
systemctl stop firewalld && systemctl disable firewalld
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
关闭swap
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
关闭selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
调整内核参数,对于 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 net.netfilter.nf_conntrack_max=2310720 EOF
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf sysctl -p /etc/sysctl.d/kubernetes.conf
# 设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai
# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond
关闭系统不需要服务
systemctl stop postfix && systemctl disable postfix
设置 rsyslogd 和 systemd journald
mkdir /var/log/journal
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
升级系统内核为 4.44
CentOS 7.x 系统自带的 3.10.x 内核存在一些 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.243-1.el7.elrepo.x86_64) 7 (Core)'
然后重启,reboot一下
kube-proxy开启ipvs的前置条件
modprobe br_netfilter
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 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
安装 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一下
systemctl start docker
systemcel 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
mkdir -p /etc/systemd/system/docker.service.d
重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
安装 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
yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1 systemctl enable kubelet.service
导入kubeadm-basic.images.tar.gz 到 /root后进行解压
vi /root/load-images.sh
然后输入:
#!/bin/bash cd /root tar xzvf kubeadm-basic.images.tar.gz ls /root/kubeadm-basic.images > /tmp/image-list.txt cd /root/kubeadm-basic.images for i in $( cat /tmp/image-list.txt ) do docker load -i $i done rm -rf /tmp/image-list.txt
保存退出
scp -r kubeadm-basic.images.tar.gz load-images.sh root@node01:/root/ scp -r kubeadm-basic.images.tar.gz load-images.sh root@node02:/root/
sh load-images.sh
初始化主节点(仅在主节点进行操作)
kubeadm config print init-defaults > kubeadm-config.yaml
会在当前路径下生成一个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.223.42.26 bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock name: 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
需要添加以及修改的地方已经用加粗进行了标注,请注意查看
接下来进行初始化
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
加入主节点以及其余工作节点
先执行安装日志中的加入命令,可以查看一下 kubeadm-init.log文件
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config kubectl get node mkdir -p install-k8s/core/pluginflannel mv kubeadm-init.log kubeadm-config.yaml install-k8s/core/
此时发现安装过程中会生成一些文件,我们将k8s的文件都放入一个单独的地方,我创建了一个usr/local/install-k8s/的文件夹,将初始化文件以及配置文件都放进去。
此时kubectl get node可以看到master01节点已经可以获取到,但是是notready状态
接下来安装flannel网络插件,以便节点间进行通讯
cd usr/local/install-k8s
mkdir core/plugin/flannel
cd core/plugin/flannel
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
echo "151.101.76.133 raw.githubusercontent.com" >> /etc/hosts
kubectl create -f kube-flannel.yml
kubectl get pod -n kube-system
kubectl get node
此时可以发现master01节点已经可以获取到,并且是ready状态。
cat /root/install-k8s/core/kubeadm-init.log
最后一行复制到其它节点执行,将剩余节点加入到集群中
kubeadm join 192.223.42.26:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:ad7a47f32e31817c0544708e380ddf55909542517280ac0abc74aac378795423
每个人的不一样,不要复制我的。如果上面的步骤有问题,请先kubeadm reset一下,然后再重新执行。
kubectl get node
kubectl get pod -n kube-system
kubectl get pod -n kube-system -o wide
安装Harbor管理自己的镜像
修改主机名
hostnamectl set-hostname hub
按照前面的步骤将安装harbor的这台机器与其他的机器相互添加hosts,网络配置也是一样。
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git systemctl stop firewalld && systemctl disable firewalld
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
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 net.netfilter.nf_conntrack_max=2310720 EOF
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf sysctl -p /etc/sysctl.d/kubernetes.conf timedatectl set-timezone Asia/Shanghai timedatectl set-local-rtc 0 systemctl restart rsyslog systemctl restart crond systemctl stop postfix && systemctl disable postfix mkdir /var/log/journal mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF [Journal] 45 Storage=persistent Compress=yes SyncIntervalSec=5m RateLimitInterval=30s RateLimitBurst=1000 SystemMaxUse=10G SystemMaxFileSize=200M MaxRetentionSec=2week ForwardToSyslog=no EOF
systemctl restart systemd-journald rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm yum --enablerepo=elrepo-kernel install -y kernel-lt cat /etc/grub2.cfg | grep "4.4" cat /etc/grub2.cfg | grep "4.4"
做完以上操作,reboot一下
modprobe br_netfilter
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 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4 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 grub2-set-default 'CentOS Linux (4.4.243-1.el7.elrepo.x86_64) 7 (Core)'
再次reboot一下
systemctl start docker
systemctl enable docker
cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "insecure-registries": ["https://hub.Fredy.com"] } EOF
在daemon.json文件中,将自己的镜像仓库地址填进去,自己随便想一个就好了,我的是hub.fredy.com,在每个节点中都将这句话添加一下。
systemctl restart docker
然后将docker-compose文件与harbor安装的压缩包上传到对应的hub服务器上,在导入的路径下执行一下操作。
yum -y install lrzsz mv docker-compose /usr/local/bin/ chmod a+x /usr/local/bin/docker-compose tar xzvf harbor-offline-installer-v1.2.0.tgz mv harbor /usr/local cd /usr/local/harbor
在/usr/local/harbor路径下修改harbor.cfg文件
vi harbor.cfg
首先将地址设置为之前咱们填过的自己想的地址 hostname = hub.Fredy.com,然后我们需要关注文件中一下代码:
ui_url_protocol = https db_password = root123 ssl_cert = /data/cert/server.crt ssl_cert_key = /data/cert/server.key
clair_db_password = password
harbor_admin_password = Harbor12345
这里有你harbor得证书地址以及密钥地址和你harbor登陆的账号和密码,可以自己进行修改
mkdir -p /data/cert/ cd /data/cert/
创建 https 证书以及配置相关目录权限
openssl genrsa -des3 -out server.key 2048 openssl req -new -key server.key -out server.csr cp server.key server.key.org openssl rsa -in server.key.org -out server.key openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt chmod a+x * cd -
回到local/harbor目录,然后运行install.sh脚本
./install.sh
再去本地电脑的hosts文件下将安装harbor的服务器地址与hub.Fredy.com添加进去
192.223.42.41 hub.Fredy.com
此时就可以在电脑上通过hub.Fredy.com访问到个人的harbor镜像仓库
在node节点中通过docker登录到harbor,docker login之后输入用户名与密码即可
docker login https://hub.Fredy.com
下载一个nginx镜像
docker run -d --name nginx01 -p:3344:80 nginx
注意观察推送镜像时候需要注意的问题,必须要满足harbor所要求的标签格式
对刚刚下载下来的nginx镜像打上对应的标签
docker tag nginx hub.yyq.com/library/mynginx:v1
docker push hub.Fredy.com/library/mynginx:v1
哦嚯,恭喜,镜像上传成功。
继续在master节点测试:
kubectl run nginx-deployment --image=hub.Fredy.com/library/mynginx:v1 --port=80 --replicas=1
这个命令会启动一个Deployment去指定位置下载nginx镜像并指定80端口,规定副本数目为1
kubectl get deployment
kubectl get rs
kubectl get pod
kubectl get pod -o wide
发现这个pod运行在node01上,然后到node01上
curl 10.244.1.2
在master节点上删除这个pod,会发现一直重新拉起一个新的pod,这里就不再继续放入代码和图片进行操作了。
尝试修改副本数目:
kubectl scale --replicas=3 deployment/nginx-deployment
kubectl get pod
发现现在起了三个pod。
kubectl expose deployment nginx-deployment --port=30000 --target-port=80
80是刚才kubectl run设置的端口 30000是为svc设置的端口
kubectl get svc
curl 10.99.244.170:30000
查看轮询规则
ipvsadm -Ln
调整 svc配置供外部访问
kubectl get svc
kubectl edit svc nginx-deployment
调整type: NodePort
接下来,就可以在浏览器上通过master01节点的ip地址加上31679端口进行访问。
结束。
写在文末:感谢尚硅谷提供的视频以及课件资料,本文所有安装资料均来自尚硅谷的课程。需要安装包和一些安装文件的可以留言,或者加我Q:327520514,需要备注,不然不通过哦