云端技术驾驭DAY09——k8s集群安装部署、calico插件部署、计算节点配置管理

往期回顾:
云端技术驾驭DAY01——云计算底层技术奥秘、云服务器磁盘技术、虚拟化管理、公有云概述
云端技术驾驭DAY02——华为云管理、云主机管理、跳板机配置、制作私有镜像模板
云端技术驾驭DAY03——云主机网站部署、web集群部署、Elasticsearch安装
云端技术驾驭DAY04——Logstash安装部署及插件模块
云端技术驾驭DAY06——容器技术概述、镜像与容器管理、定制简单镜像、容器内安装部署服务
云端技术驾驭DAY07——Dockerfile详解、容器镜像制作、私有仓库
云端技术驾驭DAY08——部署容器服务、Compose微服务管理、harbor仓库部署及管理

解密云原生

集群概述

Kubernetes概述
  • Kubernetes起源
    – 就在Docker容器技术被炒得热火朝天之时,人们发现如果想要将Docker应用于具体的业务实现,是存在困难的——编排、管理和调度等各个方面。于是人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理,就在这个时候,Kuberneres出现了
    – Kubernetes简称k8s
  • k8s是做什么的?
    – k8s的创造者是Google
    – k8s并不是全新的发明,他是Google十多年大规模容器管理技术Borg的开源版本
    – k8s是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、自动维护等功能
k8s集群架构
  • 核心架构
    – master(管理节点)
    – node(计算节点)
    – image(镜像仓库)
    在这里插入图片描述
角色与功能
  • Master功能
    – 提供集群的控制
    – 对集群进行全局决策
    – 检测和响应集群事件
  • Master节点核心组件
    – API Server
    – Scheduler
    – ControllerManager
    – etcd
  • Node功能
    – 运行容器的实际节点
    – 提供运行环境
    – 在多个节点上运行
    – 水平扩展
  • Node核心组建
    – Kubelet
    – kube-proxy
    – Runtime
  • 镜像仓库
    – 存储镜像
    – 为节点提供镜像支持
  • 仓库组件
    – Registry或Harbor

安装部署控制节点

安装控制节点

部署概述
  • 官网:链接: kubernetes.io
  • 安装部署方式
    – 源码部署
    – 容器部署(推荐)
  • 部署环境要求
    – 内核版本 >= 3.10
    – 最低配置 2CPU,2G内存
    – 禁用firewalld
    – 禁用swap
  • 集群规划:按以下清单购买准备云主机
主机名IP配置
master192.168.1.502CPU,4G内存
node-0001192.168.1.512CPU,4G内存
node-0002192.168.1.522CPU,4G内存
node-0003192.168.1.532CPU,4G内存
node-0004192.168.1.542CPU,4G内存
node-0005192.168.1.552CPU,4G内存
harbor(于DAY08已部署完成)192.168.1.302CPU,4G内存
  • 验证harbor仓库状态
[root@harbor ~]# docker compose -p harbor ps
控制节点安装
  1. 配置软件仓库(下载docker和k8s相关组件)
[root@ecs-proxy ~]# rsync -av docker/ /var/localrepo/docker/
[root@ecs-proxy ~]# rsync -av kubernetes/packages/ /var/localrepo/k8s/
[root@ecs-proxy ~]# createrepo --update /var/localrepo/
  1. 系统环境配置
[root@master ~]# sed '/swap/d' -i /etc/fstab
[root@master ~]# swapoff -a
[root@master ~]# dnf -y remove firewalld-*
[root@master ~]# vim /etc/hosts
... ...
192.168.1.30    harbor
192.168.1.50    master
192.168.1.51    node-0001
192.168.1.52    node-0002
192.168.1.53    node-0003
192.168.1.54    node-0004
192.168.1.55    node-0005
  1. 安装软件包
[root@master ~]# dnf -y install \
> kubeadm \                  // 集群配置工具
> kubelet \                  // 管理pod,在集群中的每个节点上启动
> kubectl \                  // 用来与集群通信的命令行工具
> containerd.io \            // 容器管理软件
> ipvsadm \                  // 集群管理工具
> ipset \                    // 管理IP集
> iproute-tc                 // 网络流量管理工具
[root@master ~]# containerd config default >/etc/containerd/config.toml     // 生成默认配置文件
[root@master ~]# vim /etc/containerd/config.toml
 61     sandbox_image = "harbor:443/k8s/pause:3.9"
125             SystemdCgroup = true
154         [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]     // 插入以下行
155           endpoint = ["https://harbor:443"]
156         [plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor:443"]
157           endpoint = ["https://harbor:443"]
158         [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor:443".tls]
159           insecure_skip_verify = true
[root@master ~]# systemctl enable kubelet containerd --now
  1. 配置内核参数
[root@master ~]# cat >/etc/modules-load.d/containerd.conf<<EOF
> overlay                          // overlay文件系统模块,用于在容器之间共享数据
> br_netfilter                     // 网桥防火墙模块
> xt_conntrack                     // 链接跟踪表模块
> EOF
[root@master ~]# systemctl start systemd-modules-load.service
[root@master ~]# cat >/etc/sysctl.d/99-kubernetes-cri.conf<<EOF
> net.ipv4.ip_forward = 1                                       // 开启路由转发
> net.bridge.bridge-nf-call-iptables = 1                        // 开启桥流量监控
> net.bridge.bridge-nf-call-ip6tables = 1                       // 开启桥流量监控
> net.netfilter.nf_conntrack_max = 1000000                      // 设置链接跟踪表大小
> EOF
[root@master ~]# sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf
导入k8s镜像
  • 如何获取镜像?
    – 使用kubeadm管理工具可以查询镜像信息kubeadm config images list,然后docker pull下载
    – 在可以访问官方镜像仓库的机器上使用docker pull下载
  1. 导入镜像
[root@ecs-proxy ~]# rsync -av kubernetes/init 192.168.1.50:
[root@master ~]# dnf -y install docker-ce
[root@master ~]# mkdir /etc/docker
[root@master ~]# vim /etc/docker/daemon.json
{
    "registry-mirrors":["https://harbor:443"],
    "insecure-registries":["harbor:443"]
}
[root@master ~]# systemctl enable docker --now
[root@master ~]# docker login harbor:443 
Username: admin
Password: admin123
Login Succeeded
[root@master ~]# docker load -i init/v1.26.0.tar.xz
[root@master ~]# docker images|while read i t _;do     // 将本地镜像推送到Harbor仓库,并删除本地的镜像
> [[ "${t}" == "TAG" ]] && continue
> [[ "${i}" =~ ^"harbor:443/".+ ]] && continue
> docker tag ${i}:${t} harbor:443/k8s/${i##*/}:${t}
> docker push harbor:443/k8s/${i##*/}:${t}
> docker rmi ${i}:${t} harbor:443/k8s/${i##*/}:${t}
> done
初始化主控节点
  1. 设置kube命令的Tab键补全
[root@master ~]# source <(kubeadm completion bash|tee /etc/bash_completion.d/kubeadm)
[root@master ~]# source <(kubectl completion bash|tee /etc/bash_completion.d/kubectl)
  1. 测试系统环境
[root@master ~]# kubeadm init --config=init/init.yaml --dry-run 2> error.log
[root@master ~]# cat error.log                   // 如果为空,代表配置正确;不为空就排错后再继续
[root@master ~]# rm -rf error.log /etc/kubernetes/tmp
  1. master安装
[root@master ~]# kubeadm init --config=init/init.yaml | tee init/init.log     // 主控节点初始化
[root@master ~]# mkdir -p $HOME/.kube              // 这条及以下两条命令在安装过程中会在屏幕上显示,复制粘贴到命令行即可
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@master ~]# kubectl get nodes          // 验证安装结果
NAME     STATUS     ROLES           AGE   VERSION
master   NotReady   control-plane   81s   v1.26.0

calico插件

calico概述
  • calico是什么
    – 在虚拟化平台中,比如OpenStack、Docker等都需要实现workloads之间互联,但同时也需要对容器做隔离控制,设置访问策略,calico就可以解决以上问题
    – calico可以让不同节点上的容器实现互联互通,同时也可以设置访问策略,它是一种容器之间网络互通的解决方案
  • calico优势
    – 更节约资源:calico使用的三层路由方法,抑制二层广播,减少了资源开销,并且具有可扩展性
    – 更容易管理:因为没有隧道,意味着workloads之间路径更短更简单,配置更少,更容易管理
    – 更少的依赖:calico仅依赖三层路由可达
    – 适配性广:较少的依赖性使它能适配所有VM、Container、白盒或者混合环境场景
calico安装
[root@master ~]# cd plugins/calico/
[root@master calico]# docker load -i calico.tar.xz
[root@master calico]# docker images|while read i t _;do
> [[ "${t}" == "TAG" ]] && continue
> [[ "${i}" =~ ^"harbor:443/".+ ]] && continue
> docker tag ${i}:${t} harbor:443/plugins/${i##*/}:${t}
> docker push harbor:443/plugins/${i##*/}:${t}
> docker rmi ${i}:${t} harbor:443/plugins/${i##*/}:${t}
> done
  • 安装calico
[root@master calico]# sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' calico.yaml      // 修改配置文件中镜像地址
[root@master calico]# kubectl apply -f calico.yaml
[root@master calico]# kubectl get nodes      // 等待一分钟,状态变为Ready即成功
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   26m   v1.26.0

kubeadm工具

  • kubeadm常用选项
命令解释
help帮助信息
version版本信息
config镜像管理命令
init集群初始化命令
reset还原、删除集群配置
join计算节点加入集群
tokentoken凭证管理
  • kubeadm创建安装文件(补充内容)
[root@master ~]# kubeadm config print init-defaults > init.yaml     // 创建模板文件
[root@master ~]# vim init.yaml                                      // 配置文件内容解释
 12   advertiseAddress: 1.2.3.4                                     // 管理节点的IP地址
 15   criSocket: unix:///var/run/containerd/containerd.sock         // socket地址
 17   name: node                                                    // 主机名称
 30 imageRepository: registry.k8s.io                                // 私有仓库地址
 32 kubernetesVersion: 1.26.0                                       // 版本信息,镜像标签
 35   podSubnet: 10.244.0.0/16                                      // 新添加,POD地址段
 36   serviceSubnet: 10.96.0.0/12                                   // Service的地址段
--------------
// 在文件最后追加以下行,使用IPVS模式
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
ipvs:
  strictARP: true
--------------
// 在文件最后追加以下行,使用Cgroup驱动模式
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: "systemd"

安装部署计算节点

token管理
  • node节点如何加入集群?
    – 从master的安装日志里查找安装指令样例
    kubeadm join 192.168.1.50:6443 --token <token> --discovery-token-ca-cert-hash sha256:<token ca hash>
  • node节点想加入集群必须有master提供的token
    – token相当于证明文件
    – token-ca-cert-hash验证文件的真伪
  • token管理命令
    --print-join-command
    --ttl 设置token生命周期,0为无限
[root@master ~]# kubeadm token list     // 查看token
TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
abcdef.0123456789abcdef   22h         2024-02-22T06:07:14Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
[root@master ~]# kubeadm token delete abcdef.0123456789abcdef     // 删除token
bootstrap token "abcdef" deleted
[root@master ~]# kubeadm token create --ttl=0 --print-join-command     // 创建token
kubeadm join 192.168.1.50:6443 --token gecjk9.1s2jkvi7nslqvr3k --discovery-token-ca-cert-hash sha256:f73d7f97da01c89856f42dfdb421554e0eb75b5dafe8a57dfa2c4edd8defbc51
  • 如何获取token证书的hash
    – 方式一:安装日志
    – 方式二:创建token时显示
    – 方式三:找到CA证书路径/etc/kubernetes/pki/ca.crt,通过openssl指令获取
[root@master pki]# openssl x509 -pubkey -in ca.crt | \
> openssl rsa -pubin -outform der | \
> openssl dgst -sha256 -hex
writing RSA key
(stdin)= f73d7f97da01c89856f42dfdb421554e0eb75b5dafe8a57dfa2c4edd8defbc51
node安装
  • 在每台node主机上,完成“安装控制节点”的“2”,“3”,“4”步骤,这里用playbook的方式完成
[root@ecs-proxy ~]# mkdir kubernetes/nodejoin/     // 创建ansible工作目录
[root@ecs-proxy ~]# cd kubernetes/nodejoin/
[root@ecs-proxy nodejoin]# vim ansible.cfg     // 创建ansible配置文件
[defaults]
inventory         = hostlist
host_key_checking = False
[root@ecs-proxy nodejoin]# vim hostlist     // 创建主机清单文件
[nodes]
192.168.1.[51:55]
[root@ecs-proxy nodejoin]# vim nodeinit.yaml     // 编写playbook
- name: node join k8s cluster
  hosts: nodes
  vars:
    master: "192.168.1.50:6443"
    token: "###这里改成你自己的token###"
    token_hash: "sha256:###这里改成你自己的token ca hash###"
  tasks:
    - name: disable swap from fstab file
      lineinfile:
        path: /etc/fstab
        state: absent
        regexp: 'swap'
    - name: remove firewalld packages
      dnf:
        name: "firewalld-*"
        state: absent
    - name: install k8s node packages
      dnf:
        name: kubeadm,kubelet,kubectl,containerd.io,ipvsadm,ipset,iproute-tc
        state: latest
        update_cache: yes
    - name: update modify config.toml
      template:
        src: config.j2                          // 这个文件可以从master主机复制出来
        dest: /etc/containerd/config.toml
        owner: root
        group: root
        mode: '0644'
    - name: create containerd.conf
      copy:
        dest: /etc/modules-load.d/containerd.conf
        owner: root
        group: root
        mode: '0644'
        content: |
          overlay
          br_netfilter
          xt_conntrack
    - name: create 99-kubernetes-cri.conf
      copy:
        dest: /etc/sysctl.d/99-kubernetes-cri.conf
        owner: root
        group: root
        mode: '0644'
        content: |
          net.ipv4.ip_forward = 1
          net.bridge.bridge-nf-call-iptables = 1
          net.bridge.bridge-nf-call-ip6tables = 1
          net.netfilter.nf_conntrack_max = 1000000
    - name: set /etc/hosts
      copy:
        dest: /etc/hosts
        owner: root
        group: root
        mode: '0644'
        content: |
          ::1           localhost localhost.localdomain localhost6 localhost6.localdomain6
          127.0.0.1     localhost localhost.localdomain localhost4 localhost4.localdomain4
          192.168.1.30  harbor
          192.168.1.50  master
          {% for i in groups.nodes %}
          {{ hostvars[i].ansible_eth0.ipv4.address }}   {{ hostvars[i].ansible_hostname }}
          {% endfor %}
    - name: enable k8s kubelet,runtime service
      service:
        name: "{{ item }}"
        state: started
        enabled: yes
      loop:
        - systemd-modules-load
        - containerd
        - kubelet
    - name: check node state
      stat:
        path: /etc/kubernetes/kubelet.conf
      register: result
    - name: node join cluster
      shell: |
        swapoff -a
        sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf
        kubeadm join {{ master }} --token {{ token }} --discovery-token-ca-cert-hash {{ token_hash }}
      args:
        executable: /bin/bash
      when: result.stat.exists == False
[root@ecs-proxy nodejoin]# ansible-playbook nodeinit.yaml
  • 验证节点工作状态
[root@master pki]# kubectl get nodes
NAME        STATUS   ROLES           AGE     VERSION
master      Ready    control-plane   114m    v1.26.0
node-0001   Ready    <none>          2m49s   v1.26.0
node-0002   Ready    <none>          2m49s   v1.26.0
node-0003   Ready    <none>          2m49s   v1.26.0
node-0004   Ready    <none>          2m49s   v1.26.0
node-0005   Ready    <none>          2m49s   v1.26.0
  • 验证容器工作状态
[root@master pki]# kubectl -n kube-system get pods
NAME                                      READY   STATUS    RESTARTS   AGE
calico-kube-controllers-fc945b5f7-kv9gc   1/1     Running   0          91m
calico-node-2wz65                         1/1     Running   0          5m10s
calico-node-6jp85                         1/1     Running   0          5m10s
calico-node-d7kqk                         1/1     Running   0          5m10s
calico-node-f9h7r                         1/1     Running   0          5m10s
calico-node-nskdx                         1/1     Running   0          5m10s
calico-node-s4mn4                         1/1     Running   0          91m
coredns-844c6bb88b-v45wq                  1/1     Running   0          116m
coredns-844c6bb88b-xnkcg                  1/1     Running   0          116m
etcd-master                               1/1     Running   0          116m
kube-apiserver-master                     1/1     Running   0          116m
kube-controller-manager-master            1/1     Running   0          116m
kube-proxy-7p67m                          1/1     Running   0          116m
kube-proxy-cf96z                          1/1     Running   0          5m10s
kube-proxy-cqkg6                          1/1     Running   0          5m10s
kube-proxy-gp5z6                          1/1     Running   0          5m10s
kube-proxy-t2c8p                          1/1     Running   0          5m10s
kube-proxy-xp5vf                          1/1     Running   0          5m10s
kube-scheduler-master                     1/1     Running   0          116m
  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值