Kubernetes的部署和环境配置

一,构建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的效果如下

相关推荐
nuo5342023 小时前
进阶 1 —— Docker 中常见软件的复杂安装
docker·容器
苍狗T3 小时前
K8s 集群实战:基于 Harbor 私有仓库 + cri‑dockerd 完整部署
linux·运维·云原生·容器·kubernetes
明王明王3 小时前
从零搭建一个单节点 K8S 可观测实验室(十二):告警与故障注入——从 Pending、Firing 到故障恢复
云原生·容器·kubernetes
吃不吃早饭4 小时前
RHEL9 搭建 Harbor 私有仓库与 Ansible 自动化部署 Kubernetes 运行环境完整实践
kubernetes·自动化·ansible
分布式存储与RustFS5 小时前
RustFS 监控实战:OpenTelemetry Collector 把指标接入 Prometheus + Grafana
云原生·开源·对象存储·分布式存储·s3·rustfs·性能基准
奇特認14 小时前
kubernetes 环境部署
云原生·容器·kubernetes
ltl15 小时前
etcd 深度解剖:Watch、MVCC 与 Kubernetes 里的角色
kubernetes
mohesashou15 小时前
红帽linux的K8S部署
linux·kubernetes·ansible