三、 集群安装

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,需要备注,不然不通过哦

posted @ 2022-10-09 22:47  方方的鱼  阅读(98)  评论(0编辑  收藏  举报