一,构建harbor仓库
1,创建镜像
先部署四台虚拟机,一台master,两台node和harbor仓库
master:172.25.250.200
node:1,172.25.250.10;2,172.25.250.20
harbor仓库:172.25.250.100
2,安装docker仓库
先创建docker仓库,具体命令如下
bash
[root@harbor ~]# vim /etc/yum.repos.d/docker.repo
[docker]
name = docker
baseurl = https://mirrors.aliyun.com/docker-ce/linux/rhel/9.6/x86_64/stable/
gpgcheck = 0
3,部署harbor服务
先使用dnf命令下载docker-ce包
然后再修改内核命令
bash
#修改内核的命令如下
[root@harbor ~]# echo br_netfilter > /etc/modules-load.d/docker_mod.conf
[root@harbor ~]# modprobe -a br_netfilter
[root@harbor ~]# vim /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
#直接使用如下命令重启内核服务,让内核修改生效
[root@harbor ~]# systemctl restart systemd-modules-load.service
[root@harbor ~]# sysctl --system
然后开启docker的网桥转发策略
bash
#先打开如下文件夹
[root@harbor ~]# vim /lib/systemd/system/docker.service
#具体修改如下,注意本段该文本原有,只需要添加最后的--iptables=true命令
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true
#然后重启服务并开启开机自启动
[root@harbor ~]# systemctl daemon-reload
[root@harbor ~]# systemctl enable --now docker
4,生成https的key
如果原先未安装openssl,则需要先安装openssl包用于制作证书
使用如下命令进行证书的制作,同时在之前先创建/data/certs文件夹用于生成证书的放置
bash
#生成证书的命令
[root@harbor ~]# openssl req -newkey rsa:4096 \
-nodes -sha256 -keyout /data/certs/hexiao.org.key \
-addext "subjectAltName = DNS:reg.hexiao.org" \
-x509 -days 365 -out /data/certs/hexiao.org.crt
#具体样子如下
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shannxi
Locality Name (eg, city) [Default City]:Xi'an
Organization Name (eg, company) [Default Company Ltd]:kubernetes
Organizational Unit Name (eg, section) []:harbor
Common Name (eg, your name or your server's hostname) []:reg.hexiao.org
Email Address []:admin@hexiao.org
5,编辑harbor文件
先需要获取harbor-offline-installer-v2.5.4.tgz这个包(如果本地没有这个包可以去阿里云下载)
然后使用tar命令进行解包,具体如下(本人将包解到/opt/底下如果不做要求可以不用跟-C及后面的命令)
bash
[root@harbor ~]# tar zxf harbor-offline-installer-v2.5.4.tgz -C /opt/
然后再进入到/opt/harbor/文件夹,然后执行如下命令
bash
[root@harbor harbor]# cp harbor.yml.tmpl harbor.yml
[root@harbor harbor]# vim harbor.yml
hostname: reg.timinglee.org
certificate: /data/certs/hexiao.org.crt
private_key: /data/certs/hexiao.org.key
harbor_admin_password: 123 #此地方为harbor的密码
#安装harbor的同时部署chartmuseum组件,给Harbor增加传统Helm Chart仓库能力
[root@harbor harbor]# ./install.sh --with-chartmuseum
然后再编写启动脚本,使可以使用systemctl命令启动harbor
bash
[root@harbor ~]# vim /lib/systemd/system/harbor.service
[Unit]
Description=harbor with Docker Compose
Documentation=https://reg.hexiao.com/compose/
After=docker.service network-online.target
Requires=docker.service
[Service]
Type=oneshot
WorkingDirectory=/opt/harbor
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
同时使用systemctl命令启动harbor后使用docker ps -a查看容器镜像情况

harbor配置完成后效果如下,同时除开library仓库外其他仓库都为不存在,需要自己创建,k8s和flannei-io为后续初始化需要而创建的

二,安装ansible部署k8s运行环境
1,安装ansible
先配置epel仓库,命令如下
bash
[root@harbor ~]# vim /etc/yum.repos.d/epel.repo
[epel]
name = epel
baseurl = https://mirrors.aliyun.com/epel/9/Everything/x86_64/
gpgcheck = 0
然后下载ansible-core和ansible.noarch包
2,配置用户
使用ansible建议不要直接用root用户操作
bash
[root@harbor ~]# useradd devops
[root@harbor ~]# echo 123 | passwd --stdin devops
[root@harbor ~]# su - devops
[devops@harbor ~]$ mkdir ansible
[devops@harbor ~]$ cd ansible/
3,生成配置文件
先创建inventory文件
bash
[devops@harbor ansible]$ vim inventory
[servers]
172.25.250.200
172.25.250.20
172.25.250.10
然后创建ansible.cfg文件,如果不清楚里面具体的写法可以使用如下命令生成
bash
ansible-config init --disabled > /tmp/ansible.cfg
然后去tmp文件下的ansible.cfg查看,然后再在ansible文件夹下的ansible.cfg下进行修改,具体如下
bash
[devops@harbor ansible]$ vim ansible.cfg
[defaults]
inventory = /home/devops/ansible/inventory
remote_user = devops
ask_pass = false
host_key_checking = false
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
同时在其他虚拟机上生成用户,具体命令如下
bash
在master和node中生成devops用户
[devops@harbor ansible]$ ansible all -m user -a "name=devops state=present"
[devops@harbor ansible]$ ansible all -m shell -a 'echo "123" | passwd --stdin devops'
[devops@harbor ansible]$ ansible all -m lineinfile -a 'path=/etc/sudoers line="%devops ALL=(ALL) NOPASSWD: ALL" insertafter=EOF
然后使用如下命令测试环境,这一步尤为重要
bash
[devops@harbor ansible]$ ansible all -m ping
[devops@harbor ansible]$ ansible all -m shell -a 'whoami '
出现结果一定要与我一致


4,利用ansible部署docker
创建kubernetes-devops.yml文件,使用YAML文件方式实现批量部署,具体命令如下(YAML文件具有严格的格式要求)
bash
- name: devops k8s from ansible
hosts: all
tasks:
- name: setup docker repo
yum_repository:
name: docker
description: docker
baseurl: https://mirrors.aliyun.com/docker-ce/linux/rhel/9.6/x86_64/stable/
file: docker
gpgcheck: no
- name: install docker
dnf:
name: docker-ce
state: present
- name: setup docker.service
replace:
path: /lib/systemd/system/docker.service
regexp: "ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock"
replace: "ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --iptables=true"
- name: setup docker registry
copy:
content: |
{
"registry-mirrors":["https://reg.hexiao.org"]
}
dest: /etc/docker/daemon.json
- name: setup docker certs
file:
path: /etc/docker/certs.d/reg.hexiao.org
state: directory
- name: cp certs file
copy:
src: "{{item.src}}"
dest: "{{item.dest}}"
loop:
- src: /etc/docker/certs.d/reg.hexiao.org/ca.crt
dest: /etc/docker/certs.d/reg.hexiao.org/ca.crt
- src: /etc/docker/certs.d/reg.hexiao.org/ca.crt
dest: /etc/pki/ca-trust/source/anchors/ca.crt
- name: stup cri-dockerd
copy:
src: "{{item.src}}"
dest: "{{item.dest}}"
mode: '0755'
loop:
- src: ./cri-dockerd/cri-dockerd
dest: /usr/bin/cri-dockerd
- src: "./cri-dockerd/cri-docker.service"
dest: "/lib/systemd/system/cri-docker.service"
- src: "./cri-dockerd/cri-docker.socket"
dest: "/lib/systemd/system/cri-docker.socket"
- name: update ca cert
shell: "update-ca-trust extract;sysctl --system;systemctl daemon-reload"
- name: start services
service:
name: "{{item}}"
state: restarted
enabled: yes
loop:
- docker
- systemd-modules-load.service
- cri-docker
- name: load module
copy:
dest: "{{item.dest}}"
content: "{{item.value}}"
loop:
- dest: /etc/modules-load.d/docker_mod.conf
value: br_netfilter
- dest: /etc/sysctl.d/docker.conf
value: |
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
- name: update ca cert
shell: "update-ca-trust extract;sysctl --system"
- name: start services
service:
name: "{{item}}"
state: restarted
enabled: yes
loop:
- docker
- systemd-modules-load.service
- name: install kubernetes from ansible
hosts: all
tasks:
- name: setup k8s repo
yum_repository:
name: kubernetes
description: kubernetes
baseurl: https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm
file: kubernetes
gpgcheck: no
- name: install software in master
dnf:
name: "{{item}}"
state: present
loop:
- kubeadm-1.35.7-150500.1.1
- kubelet-1.35.7-150500.1.1
- kubectl-1.35.7-150500.1.1
when: inventory_hostname == "172.25.250.200"
- name: install software in work node
dnf:
name: "{{item}}"
state: present
loop:
- kubeadm-1.35.7-150500.1.1
- kubelet-1.35.7-150500.1.1
when: inventory_hostname == "172.25.250.10" or inventory_hostname == "172.25.250.20"
- name: setup kubectl kubeadm complication
lineinfile:
path: /root/.bashrc
line: |
source <(kubectl completion bash)
source <(kubeadm completion bash)
when: inventory_hostname == "172.25.250.200"
- name: start kubelet
service:
name: kubelet
state: started
enabled: yes
编写完后不要急着运行,里面有下面第5步和第6步的批量部署命令,此时运行会报错,我为了方便就未隔离开,同时里面的IP等东西需要根据自己来进行修改,不可一味复制
5,利用ansbile部署cri-dockerd
先拉取cri-dockerd包,如果本地没有这使用wget去阿里云上寻找同时最好拉取到ansible文件夹下
然后使用tar进行解包,解包完成后会生成cri-dockerd文件夹,前往文件夹下创建cri-docker.service文件,使cri-dockerd可以使用systemctl命令进行启动,具体命令如下
bash
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=reg.hexiao.org/k8s/pause:3.10.1
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
然后再打开kubernetes-devops.yml文件进行编写,实现批量下载(详细代码如上第4点)
6,利用ansible部署k8s
打开kubernetes-devops.yml文件进行编写,实现批量下载(详细代码如上第4点),然后使用如下命令执行,同时注意在master,harbor,node虚拟机上的/etc/hosts文件里面进行解析
bash
[devops@harbor ansible]$ ansible-playbook kubernetes-devops.yml
里面的解析如下

然后进入到master
bash
[root@k8s-master mnt]# source ~/.bashrc
[root@k8s-master mnt]# kubectl 输入后连按两次tab键
[root@k8s-master mnt]# kubeadm

三,集群初始化部署
1,初始化部署
在master下执行如下命令进行初始化
bash
[root@k8s-master ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 \
--image-repository reg.hexiao.org/k8s \
--kubernetes-version v1.35.7 \
--cri-socket=unix:///var/run/cri-dockerd.sock
然后会生成集群凭证,再node上执行如下命令加入集群

在node中执行如图命令时在末尾添加--cri-socket=unix:///var/run/cri-dockerd.sock命令(在node中执行的为kubeadm join及后面一堆的命令而不是kubeadm token,这个为查看凭证命令)
执行完成后前往master中添加环境变量
bash
[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" > ~/.bash_profile
[root@k8s-master ~]# source ~/.bash_profile
然后使用kubectl get nodes命令查看,情况如下

同时STATUS这里应该为NotReady而不是Ready,我这里是已经完成下一步后的效果
2,安装网络插件
需要kube-flannel包,本地没有需要前往阿里云下,然后使用tar命令进行解包,解包后出现flannel文件夹,前往这个文件夹下,执行如下命令
bash
#先导入到本地镜像,镜像名字flannel下有
[root@k8s-master flannel]# docker load -i kube-flannel-v0.28.9.tar
Loaded image: ghcr.io/flannel-io/flannel-cni-plugin:v1.9.1-flannel3
Loaded image: ghcr.io/flannel-io/flannel:v0.28.9
#进行标签制作与上载
[root@master ~]# docker tag ghcr.io/flannel-io/flannel-cni-plugin:v1.9.0-flannel1 reg.hexiao.org/flannel-io/flannel-cni-plugin:v1.9.0-flannel1
[root@master ~]# docker push reg.hexiao.org/flannel-io/flannel-cni-plugin:v1.9.0-flannel1
[root@master ~]# docker tag ghcr.io/flannel-io/flannel:v0.28.1 reg.hexiao.org/flannel-io/flannel:v0.28.1
[root@master ~]# docker push reg.hexiao.org/flannel-io/flannel:v0.28.1
然后使用kubectl get nodes的效果如下
