目录
一、部署步骤
二、部署kubernetes
2.1、所有节点关闭防火墙 核心防护 iptables规则 swap交换
2.2、修改主机名并添加主机映射
2.3、调整内核参数
三、安装Docker
3.1、所有节点安装docker
3.2、所有接点添加镜像加速器
3.3、开启docker、并设置开机自启、查看状态
四、安装kubeadm,kubelet和kubectl
4.1、定义kubernetes源
4.2、安装kubeadm,kubelet和kubectl
4.3、开机自启kubelet
五、部署K8S集群
5.1、查看初始化需要的镜像
5.2、初始化kubeadm
5.3、设定kubectl
5.4、所有节点部署网络插件
5.5、在 node 节点上执行 kubeadm join 命令加入群集并查看状态
5.6、测试pod创建资源
5.7、暴露端口提供服务
5.8、测试访问
5.9、扩展3个副本
六、部署 Dashboard
6.1、上传 相关yaml 文件到 /opt/k8s 目录中
6.2、创建service account并绑定默认cluster-admin管理员集群角色
七、安装Harbor私有仓库
7.1、修改主机名,添加主机名和ip的映射
7.2、安装Docker20版本
7.2.1 添加镜像加速器
7.2.2 开启docker并设为开机自启
7.3、安装harbor
7.3.1 准备docker-compose安装包
7.3.2 准备harbor私有仓库的安装包
7.3.3 生成证书、私钥
7.3.4 启动Harbor
7.3.5 浏览器访问
7.3.6 在一个node节点上登录harbor
7.3.7 登录Harbar上传镜像
7.4、安装ipvsadm
7.4.1 修改调度策略,再去访问
7.5、浏览器访问
7.6、内核参数优化方案
一、部署步骤
- 在所有节点上安装Docker和kubeadm
- 部署Kubernetes Master
- 部署容器网络插件
- 部署 Kubernetes Node,将节点加入Kubernetes集群中
- 部署 Dashboard Web 页面,可视化查看Kubernetes资源
- 部署 Harbor 私有仓库,存放镜像资源
二、部署kubernetes
实验环境
服务器 | IP地址 | 主要组件 |
---|---|---|
master | 192.168.10.100 | docker / kubeadm / kubelet / kubectl / flannel |
node01 | 192.168.10.101 | docker/kubeadm/kubelet/kubectl/flannel |
node02 | 192.168.10.102 | docker/kubeadm/kubelet/kubectl/flanne |
harbor | 192.168.10.103 | docker、docker-compose、harbor-offline-v1.2.2 |
2.1、所有节点关闭防火墙 核心防护 iptables规则 swap交换
以下图片只展示一个,过程都一样
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
swapoff -a ##交换分区必须要关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab ##永久关闭swap分区,&符号在sed命令中代表上次匹配的结果
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done ##加载模块
2.2、修改主机名并添加主机映射
hostnamectl set-hostname master01
bash
hostnamectl set-hostname node01
bash
hostnamectl set-hostname node02
bash
echo "192.168.10.100 master01" >> /etc/hosts
echo "192.168.10.101 node01" >> /etc/hosts
echo "192.168.10.102 node02" >> /etc/hosts
echo "192.168.10.103 hub.hg.com" >> /etc/hosts
cat /etc/hosts
2.3、调整内核参数
cat > /etc/sysctl.d/kubernetes.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
//生效参数
sysctl --system
三、安装Docker
3.1、所有节点安装docker
[root@master01 ~]#yum install -y yum-utils device-mapper-persistent-data lvm2
[root@master01 ~]#yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@master01 ~]#yum install -y docker-ce docker-ce-cli containerd.io
[root@master01 ~]#mkdir /etc/docker/
[root@master01 ~]#cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
EOF
[root@master01 ~]#systemctl daemon-reload
[root@master01 ~]#systemctl restart docker.service
[root@master01 ~]#systemctl enable docker.service
3.2、所有接点添加镜像加速器
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
EOF
#使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。
#日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。
3.3、开启docker、并设置开机自启、查看状态
systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service
systemctl status docker.service
docker info | grep "Cgroup Driver"
Cgroup Driver: systemd ##结果
四、安装kubeadm,kubelet和kubectl
所有节点安装
4.1、定义kubernetes源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
4.2、安装kubeadm,kubelet和kubectl
yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11
4.3、开机自启kubelet
systemctl enable kubelet.service
五、部署K8S集群
5.1、查看初始化需要的镜像
[root@master01 ~]#kubeadm config images list
[root@master01 opt]#unzip v1.20.11.zip -d /opt/k8s/
[root@master01 opt]#cd /opt/k8s/v1.20.11/
[root@master01 v1.20.11]#for i in $(ls *.tar); do docker load -i $i; done
#复制镜像和脚本到 node 节点,并在 node 节点上执行脚本加载镜像文件
[root@master01 v1.20.11]#scp -r /opt/k8s/ root@192.168.10.132:/opt/
[root@master01 v1.20.11]#scp -r /opt/k8s/ root@192.168.10.133:/opt/
[root@node01 v1.20.11]# for i in $(ls *.tar); do docker load -i $i; done
[root@node02 v1.20.11]# for i in $(ls *.tar); do docker load -i $i; done
5.2、初始化kubeadm
kubeadm config print init-defaults > /opt/kubeadm-config.yaml
vim kubeadm-config.yaml
advertiseAddress: 192.168.10.100 ## 12行
kubernetesVersion: v1.20.11 ## 34行
podSubnet: 10.244.0.0/16 ## 37行
serviceSubnet: 10.96.0.0/16 ## 38行
--- ## 40行
apiVersion: kubeproxy.config.k8s.io/v1alpha1 ## 41行
kind: KubeProxyConfiguration ## 42行
mode: ipvs ## 43行
kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
#--experimental-upload-certs 参数可以在后续执行加入节点时自动分发证书文件,K8S V1.16版本开始替换为 --upload-certs
#tee kubeadm-init.log 用以输出日志
//查看 kubeadm-init 日志
less kubeadm-init.log
//kubernetes配置文件目录
ls /etc/kubernetes/
//存放ca等证书和密码的目录
ls /etc/kubernetes/pki
5.3、设定kubectl
kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,它可由 kubectl 通过默认的 “$HOME/.kube/config” 的路径进行加载。
[root@master01 opt]#mkdir -p $HOME/.kube
[root@master01 opt]#cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master01 opt]#chown $(id -u):$(id -g) $HOME/.kube/config
[root@master01 opt]#kubectl get node
[root@master01 opt]#kubectl get cs
#如果 kubectl get cs 发现集群不健康,更改以下两个文件
[root@master01 opt]#vim /etc/kubernetes/manifests/kube-scheduler.yaml
[root@master01 opt]#vim /etc/kubernetes/manifests/kube-controller-manager.yaml
把httpGet:字段下的hosts由127.0.0.1变成192.168.10.100(有两处)
#- --port=0 # 搜索port=0,把这一行注释掉
host: 192.168.10.100 ##修改地址
[root@master01 opt]#systemctl restart kubelet.service
[root@master01 opt]#kubectl get cs
[root@master01 opt]#kubectl get node
[root@master01 opt]#vim /etc/kubernetes/manifests/kube-scheduler.yaml
- --bind-address=192.168.10.100 ## 第16行
# - --port=0 ## 第19行
host: 192.168.10.100 ## 第25行
host: 192.168.10.100 ## 第39行
[root@master01 opt]#vim /etc/kubernetes/manifests/kube-scheduler.yaml
- --bind-address=192.168.10.100 ## 第17行
# - --port=0 ## 第26行
host: 192.168.10.100 ## 第37行
host: 192.168.10.100 ## 第51行
5.4、所有节点部署网络插件
cd /opt
unzip kuadmin.zip ##上传所需要的压缩包
解压
unzip kuadmin.zip
scp flannel-cni-v1.2.0.tar flannel-v0.22.2.tar node01:/opt/ ##拷贝到node01
scp flannel-cni-v1.2.0.tar flannel-v0.22.2.tar node01:/opt/ ##拷贝到node02
[root@master01 opt]#docker load -i flannel-cni-v1.2.0.tar
[root@master01 opt]#docker load -i flannel-v0.22.2.tar
[root@master01 opt]#docker images
[root@master01 opt]#kubectl apply -f kube-flannel.yml
[root@master01 opt]#kubectl get node
5.5、在 node 节点上执行 kubeadm join 命令加入群集并查看状态
将node节点加进来,
[root@master01 opt]#ls
[root@master01 opt]#cat kubeadm-init.log
##node01和node02上面添加
kubeadm join 192.168.10.100:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:3800375b6db6fe668a7812e883ff1dc7ecc405c5ead58d289a6f015b594d1205
##master01查看
[root@master01 opt]#kubectl get node
[root@master01 opt]#kubectl get cs
[root@master01 opt]#kubectl get pods -n kube-system
[root@master01 opt]#kubectl get pod -n kube-flannel
[root@master01 opt]#kubectl get pod -n kube-flannel -owide
由于机器的原因,换了三台,和之前位置相似
5.6、测试pod创建资源
kubectl create deployment nginx --image=nginx ##拉取nginx
[root@master01 opt]#kubectl get pod ##看是否拉取到
[root@master01 opt]#kubectl get pod -owide ##查看详细信息
[root@master01 opt]#curl 10.244.2.2 ##只能对内访问,不能访问
5.7、暴露端口提供服务
[root@master01 opt]#kubectl expose deployment nginx --port=80 --type=NodePort
[root@master01 opt]#kubectl get svc
5.8、测试访问
192.168.10.103:31606
192.168.10.104:31606
5.9、扩展3个副本
[root@master01 opt]#kubectl scale deployment nginx --replicas=3
[root@master01 opt]#kubectl get pods -o wide
六、部署 Dashboard
6.1、上传 相关yaml 文件到 /opt/k8s 目录中
在 master01 节点上操作
在 master01 节点上操作
#上传 recommended.yaml 文件到 /opt/k8s 目录中
cd /opt/k8s
vim recommended.yaml
#默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 30001 #添加
type: NodePort #添加
selector:
k8s-app: kubernetes-dashboard
##上传dashboard.tar metrics-scraper.tar到/opt目录下
##远程从master拷贝到node节点的/opt下
[root@master01 opt]#scp dashboard.tar metrics-scraper.tar node01:/opt/
##master节点执行下面语句
kubectl apply -f recommended.yaml
#使用输出的token登录Dashboard
https://NodeIP:30001
6.2、创建service account并绑定默认cluster-admin管理员集群角色
#创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
6.3、登录Dashboard
#使用输出的token登录Dashboard
https://NodeIP:30001无论哪个node的IP地址、因为服务都是运行在node上的
https://192.168.10.104:30001
七、安装Harbor私有仓库
7.1、修改主机名,添加主机名和ip的映射
#修改主机名
hostnamectl set-hostname hub.hg.com
#所有节点加上主机名映射
echo "192.168.10.103 master01" >> /etc/hosts
echo "192.168.10.104 node01" >> /etc/hosts
echo "192.168.10.105 node02" >> /etc/hosts
echo "192.168.10.106 hub.hg.com" >> /etc/hosts
cat /etc/hosts
7.2、安装Docker20版本
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce-20.10.18 docker-ce-cli-20.10.18 containerd.io
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"insecure-registries": ["https://hub.hg.com"]
}
EOF
systemctl start docker
systemctl enable docker
7.2.1 添加镜像加速器
所有节点都需要修改
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"insecure-registries": ["https://hub.hg.com"]
}
7.2.2 开启docker并设为开机自启
##首先加载一下,因为前面把每个节点都配置了镜像加速器
systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service
systemctl status docker.service
##此处就显示一个界面,其他节点的不展示了
7.3、安装harbor
7.3.1 准备docker-compose安装包
[root@hub ~]#cd /usr/local/bin/
##上传docker-compose ##直接将docker-compose上传到/usr/local/bin/
docker-compose
[root@hub bin]#chmod +x docker-compose ##添加执行权限
7.3.2 准备harbor私有仓库的安装包
官网下载地址:http://harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz
##首先进入/opt,然后将下载好的harbor压缩包上传到/opt
##进行解压
[root@hub opt]#tar xf harbor-offline-installer-v1.2.2.tgz
##将harbor配置文件进行备份
[root@hub harbor]#cp harbor.cfg{,.bak}
##对harbor.cfg配置文件进行修改
[root@hub harbor]#vim harbor.cfg
hostname = reg.hg.com ##第5行
ui_url_protocol = https ##第9行
db_password = root123 ##第12行
ssl_cert_key = /data/cert/server.key ##第25行
harbor_admin_password = Harbor12345 ##第59行
7.3.3 生成证书、私钥
生成证书
make -p /data/cert
cd /data/cert
#生成私钥
openssl genrsa -des3 -out server.key 2048
##密码:123456
-------------------------------------------------------------------------------------------
openssl #这是一个强大的加密库和工具集,用于处理SSL/TLS协议和相关的加密操作。
genrsa #openssl的子命令,用于生成 RSA 私钥。
-des3 #openssl 使用 DES3算法来加密生成的私钥。
-out server.key #这个选项指定了输出文件的名称,即生成的私钥将被保存在名为server.key的文件中。
2048 #这个数字指定了RSA密钥的长度(以位为单位)。
#生成证书签名请求文件
openssl req -new -key server.key -out server.csr
=========================================================================================
req #用于处理与证书签名请求(CSR)和私钥相关的任务。
-new #这个选项指示OpenSSL创建一个新的证书签名请求。
-key server.key #指定用于生成CSR的私钥文件的路径
-out server.csr #指定生成的CSR文件的输出路径。
=========================================================================================
-----------------------------------------------------------------------------------------
输入私钥密码:123456
输入国家名:CN
输入省名:BJ
输入市名:BJ
输入组织名:HG
输入机构名:HG
输入域名:hub.hg.com
输入管理员邮箱:admin@hg.com
其它全部直接回车
-----------------------------------------------------------------------------------------
#备份私钥
cp server.key server.key.org
#清除私钥密码
openssl rsa -in server.key.org -out server.key
输入私钥密码:123456
#签名证书
openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crt
chmod +x /data/cert/*
cd /opt/harbor/
./install.sh
备份私钥
cp server.key server.key.org
清除私钥密码
openssl rsa -in server.key.org -out server.key
签名证书
openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crt
===========================================================================================
openssl x509 #这是OpenSSL的一个子命令,用于处理X.509证书。
-req #指示OpenSSL从一个CSR文件中读取请求信息。
-days 1000 #设置证书的有效期为1000天。这意味着证书将在 1000 天后过期。
-in server.csr #指定CSR文件的输入路径
-signkey server.key #使用指定的私钥(server.key)对CSR进行签名,生成证书。
-out server.crt #指定输出的证书文件路径。在这个例子中,证书文件将被保存为server.crt
===========================================================================================
chmod +x /data/cert/*
7.3.4 启动Harbor
[root@hub cert]#cd /opt/harbor/
[root@hub harbor]#./install.sh
#执行命令 ./install.sh 以 pull 镜像并启动容器
#运行./install.sh时,这个脚本会执行一系列的步骤来配置和启动Harbor服务。这些步骤可能包括:
#检查和准备安装环境(如检查必要的依赖项、配置文件等)。
#生成或验证 Harbor 的配置文件(通常是 harbor.yml)。
#创建必要的数据目录和文件。
#初始化数据库(如果使用了数据库存储)。
#启动 Harbor 的各个组件(如 core、registry、portal、jobservice 等)
7.3.5 浏览器访问
添加主机映射
在本地使用火狐浏览器访问:https://hub.hg.com
点击高级--->添加例外---->确认安全例外
用户密码登录,默认为:
用户名:admin
密码:Harbor12345
7.3.6 在一个node节点上登录harbor
docker login -u admin -p Harbor12345 https://hub.hg.com
7.3.7 登录Harbar上传镜像
在node01节点操作
##上传镜像
docker tag nginx:latest hub.hg.com/library/nginx:v1
docker push hub.hg.com/library/nginx:v1
在master节点上删除之前创建的nginx资源
kubectl delete deployment nginx
kubectl create deployment nginx-deployment --image=hub.hg.com/library/nginx:v1 --port=80 --replicas=3
kubectl expose deployment nginx-deployment --port=30000 --target-port=80
kubectl get svc,pods
kubectl get svc,pods -owide
访问验证
curl 10.244.1.7
7.4、安装ipvsadm
[root@master01 k8s]#yum -y install ipvsadm.x86_64
[root@master01 k8s]#ipvsadm -Ln
[root@master01 k8s]#curl 10.96.30.170:30000
7.4.1 修改调度策略,再去访问
kubectl edit svc nginx-deployment
25 type: NodePort #把调度策略改成NodePort
[root@master01 k8s]#kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d3h
nginx NodePort 10.96.169.156 <none> 80:31606/TCP 2d3h
nginx-deployment NodePort 10.96.30.170 <none> 30000:31973/TCP 10h
[root@master01 k8s]#
7.5、浏览器访问
浏览器访问:
http://192.168.10.103:31973/
http://192.168.10.104:31973/
http://192.168.10.105:31973/
#将cluster-admin角色权限授予用户system:anonymous
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
7.6、内核参数优化方案
cat > /etc/sysctl.d/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 #仅4.4以上版本支持
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF