重新整一遍k8s安装,之前基于centos7.8的,这次采用ubuntu22.04,k8s版本1.23.3。

virtualbox装备

采用ubuntu22.04.1版本 ,虚拟机使用virtulbox

[ubuntu22.04.1镜像下载地址] (http://mirrors.bupt.edu.cn/ubuntu-releases/22.04/)

网卡绑定2张

  • 仅主机host-only网络 (让ip固定)
  • 网络地址转换(nat) (能够上网)

docker安装

1sudo apt-get install -y docker.io 
2sudo service docker start         #启动docker服务
3sudo usermod -aG docker ${USER}   #当前用户加入docker组

minikube 安装、使用

安装

1curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
2sudo install minikube /usr/local/bin/
3# 安装kubectl ,minikube 简化了这个安装流程,命令如下
4minikube kubectl
5#/home/maozhongyu/.minikube/cache/linux/amd64/v1.24.3/kubectl 

启动minikube

1minikube start --kubernetes-version=v1.23.3
2# minikube start --image-mirror-country='cn'  --kubernetes-version=v1.23.3
3# 两个命令来查看集群的状态
4minikube status
5minikube node list
6# 登录到这个节点上,虽然它是虚拟的,但用起来和实机也没什么区别
7 minikube ssh 
8
9minikube kubectl -- version

vim .bashrc

1alias minikubectl="minikube kubectl --"
2source <(minikubectl completion bash)
1source .bashrc
2minikubectl version --short

result:

1Client Version: v1.23.3
2Server Version: v1.23.3

k8s架构图

master node组件

1apiserver 是 Master 节点——同时也是整个 Kubernetes 系统的唯一入口,它对外公开了一系列的 RESTful API,并且加上了验证、授权等功能,所有其他组件都只能和它直接通信,可以说是 Kubernetes 里的联络员
2
3etcd 是一个高可用的分布式 Key-Value 数据库,用来持久化存储系统里的各种资源对象和状态,相当于 Kubernetes 里的配置管理员。注意它只与 apiserver 有直接联系,也就是说任何其他组件想要读写 etcd 里的数据都必须经过 apiserver
4
5scheduler 负责容器的编排工作,检查节点的资源状态,把 Pod 调度到最适合的节点上运行,相当于部署人员。因为节点状态和 Pod 信息都存储在 etcd 里,所以 scheduler 必须通过 apiserver 才能获得
6
7controller-manager 负责维护容器和节点等资源的状态,实现故障检测、服务迁移、应用伸缩等功能,相当于监控运维人员。同样地,它也必须通过 apiserver 获得存储在 etcd 里的信息,才能够实现对资源的各种操作
1maozhongyu@maozhongyu-VirtualBox:~$ minikubectl get pod -n kube-system
2NAME                               READY   STATUS    RESTARTS      AGE
3coredns-64897985d-vf75r            1/1     Running   1 (18m ago)   19m
4etcd-minikube                      1/1     Running   1 (18m ago)   19m
5kube-apiserver-minikube            1/1     Running   2 (18m ago)   19m
6kube-controller-manager-minikube   1/1     Running   2 (18m ago)   19m
7kube-proxy-tbm9v                   1/1     Running   1 (18m ago)   19m
8kube-scheduler-minikube            1/1     Running   2 (18m ago)   19m
9storage-provisioner                1/1     Running   2 (18m ago)   19m

worker node 组件

1 kubelet、kube-proxy、container-runtime。
2
3kubelet 是 Node 的代理,负责管理 Node 相关的绝大部分操作,Node 上只有它能够与 apiserver 通信,实现状态报告、命令下发、启停容器等功能,相当于是 Node 上的一个“小管家”。
4kube-proxy 的作用有点特别,它是 Node 的网络代理,只负责管理容器的网络通信,简单来说就是为 Pod 转发 TCP/UDP 数据包,相当于是专职的“小邮差”。
5第三个组件 container-runtime 我们就比较熟悉了,它是容器和镜像的实际使用者,在 kubelet 的指挥下创建容器,管理 Pod 的生命周期,是真正干活的“苦力”

Kubernetes 的大致工作流程

1每个 Node 上的 kubelet 会定期向 apiserver 上报节点状态,apiserver 再存到 etcd 里。
2每个 Node 上的 kube-proxy 实现了 TCP/UDP 反向代理,让容器对外提供稳定的服务。
3scheduler 通过 apiserver 得到当前的节点状态,调度 Pod,然后 apiserver 下发命令给某个 Node 的 kubelet,kubelet 调用 container-runtime 启动容器。
4controller-manager 也通过 apiserver 得到实时的节点状态,监控可能的异常情况,再使用相应的手段去调节恢复。

基于vagrant,ubuntu22.04.box 安装1主2从k8s集群

还是用vagrant 解决本机部署集群, 方便,固定ip ,并且可以上网。

vagrant 版本 2.3.0

https://app.vagrantup.com/boxes/search 搜ubuntu22

ubuntu22.04 box

add vagrant box

1 vagrant box add ubuntu2204  c9ab6adf-af09-4d3d-bc6f-50eda52332f9
2 vagrant box list 
1vagrant init  

修改vagrantfile

 1# -*- mode: ruby -*-
 2# vi: set ft=ruby :
 3
 4Vagrant.configure("2") do |config|
 5
 6  config.vm.define "k8s-01" do |master|
 7    master.vm.box =  "ubuntu2204"
 8    master.vm.provider "virtualbox" do |vb|
 9      vb.memory = 2048
10      vb.cpus = 2
11    end
12    master.vm.network "private_network", ip: "192.168.56.80"
13    master.vm.synced_folder "/Users/mac/code", "/home/www"
14    master.ssh.insert_key = false
15    master.vm.hostname = "master"
16  end
17
18  config.vm.define "k8s-02" do |node1|
19    node1.vm.box =  "ubuntu2204"
20    node1.vm.provider "virtualbox" do |vb|
21      vb.memory = 4096
22      vb.cpus = 2
23    end
24    node1.vm.network "private_network", ip: "192.168.56.81"
25    node1.vm.synced_folder "/Users/mac/code", "/home/www"
26    node1.ssh.insert_key = false
27    node1.vm.hostname = "node1"
28  end
29
30  config.vm.define "k8s-03" do |node2|
31    node2.vm.box =  "ubuntu2204"
32    node2.vm.provider "virtualbox" do |vb|
33      vb.memory = 2048
34      vb.cpus = 2
35    end
36    node2.vm.network "private_network", ip: "192.168.56.82"
37    node2.vm.synced_folder "/Users/mac/code", "/home/www"
38    node2.ssh.insert_key = false
39    node2.vm.hostname = "node2"
40 end
41
42end

启动、进入虚拟机

1vagrant up 
2vagrant ssh k8s-01
3vagrant ssh k8s-02
4vagrant ssh k8s-03

k8s-01,k8s-02,k8s-03 节点,hostname vagrant 已经帮我们设定好了分别叫 master,node1,node2

修改 hosts

不改后续一些命令 会异常 如 kubectl logs pod_name

1192.168.56.80 master
2192.168.56.81 node1
3192.168.56.82 node2

替换阿里云源(所有机器)

/etc/apt/sources.list

 1deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
 2deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
 3deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
 4deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
 5deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
 6deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
 7deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
 8deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
 9deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
10deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
1sudo apt-get update

安装docker ,修改docker配置 ,网络转发 (所有机器)

1sudo apt-get install -y docker.io 
2sudo service docker start         #启动docker服务
3sudo usermod -aG docker ${USER}   #当前用户加入docker组

在“/etc/docker/daemon.json”里把 cgroup 的驱动程序改成 systemd ,然后重启 Docker 的守护进程

 1cat <<EOF | sudo tee /etc/docker/daemon.json
 2  {  "exec-opts": ["native.cgroupdriver=systemd"],  
 3    "log-driver": "json-file",  
 4    "log-opts": {    "max-size": "100m"  },
 5    "storage-driver": "overlay2",
 6    "registry-mirrors": ["http://hub-mirror.c.163.com"] 
 7  }
 8EOF
 9sudo systemctl enable docker
10sudo systemctl daemon-reload
11sudo systemctl restart docker

为了让 Kubernetes 能够检查、转发网络流量,你需要修改 iptables 的配置,启用“br_netfilter”模块:

 1cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
 2    br_netfilter
 3EOF
 4
 5cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
 6  net.bridge.bridge-nf-call-ip6tables = 1
 7  net.bridge.bridge-nf-call-iptables = 1
 8  net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
 9EOF
10
11sudo sysctl --system

你需要修改“/etc/fstab”,关闭 Linux 的 swap 分区,提升 Kubernetes 的性能

1sudo swapoff -a
2sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab

安装 kubeadm,kubelet,kubectl (所有机器)

kubeadm 可以直接从 Google 自己的软件仓库下载安装,但国内的网络不稳定,很难下载成功,需要改用其他的软件源,这里我选择了国内的某云厂商

1sudo apt install -y apt-transport-https ca-certificates curl
2
3curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
4
5cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
6deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
7EOF
8
9sudo apt update

用 apt install 获取 kubeadm、kubelet 和 kubectl 这三个安装必备工具(所有机器)

1sudo apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00

用 kubeadm version、kubectl version 来验证版本是否正确

1kubeadm version
2kubectl version --client

按照 Kubernetes 官网的要求,我们最好再使用命令 apt-mark hold ,锁定这三个软件的版本,避免意外升级导致版本错误

1sudo apt-mark hold kubeadm kubelet kubectl

下载 Kubernetes 组件镜像 (master节点安装)

使用命令 kubeadm config images list 可以查看安装 Kubernetes 所需的镜像列表,参数 –kubernetes-version 可以指定版本号

1kubeadm config images list --kubernetes-version v1.23.3
2
3k8s.gcr.io/kube-apiserver:v1.23.3
4k8s.gcr.io/kube-controller-manager:v1.23.3
5k8s.gcr.io/kube-scheduler:v1.23.3
6k8s.gcr.io/kube-proxy:v1.23.3
7k8s.gcr.io/pause:3.6
8k8s.gcr.io/etcd:3.5.1-0
9k8s.gcr.io/coredns/coredns:v1.8.6

从国内的镜像网站下载然后再用 docker tag 改名,能够使用 Shell 编程实现自动化

 1repo=registry.aliyuncs.com/google_containers
 2
 3for name in `kubeadm config images list --kubernetes-version v1.23.3`; do
 4
 5    src_name=${name#k8s.gcr.io/}
 6    src_name=${src_name#coredns/}
 7
 8    sudo docker pull $repo/$src_name
 9
10    sudo docker tag $repo/$src_name $name
11    sudo docker rmi $repo/$src_name
12done

ps: 另一种办法 利用 minikube。因为 minikube 本身也打包了 Kubernetes 的组件镜像,所以完全可以从它的节点里把这些镜像导出之后再拷贝过来 minikube ssh 登录进虚拟节点,用 docker save -o 命令把相应版本的镜像都保存下来,再用 minikube cp 拷贝到本地。

sudo docker images 查看镜像是否下载完毕,一共7个镜像 可以和 minikube 里的镜像做比对,按理是一致的 ,如果没全,可以多次尝试,有翻墙软件也可以直接下载尝试,下载完这些镜像最好搞成私有仓库镜像,防止后面这云厂商不提供拉取了

1vagrant@master:/etc/docker$ sudo docker images
2REPOSITORY                           TAG       IMAGE ID       CREATED         SIZE
3k8s.gcr.io/kube-apiserver            v1.23.3   f40be0088a83   6 months ago    135MB
4k8s.gcr.io/kube-scheduler            v1.23.3   99a3486be4f2   6 months ago    53.5MB
5k8s.gcr.io/kube-controller-manager   v1.23.3   b07520cd7ab7   6 months ago    125MB
6k8s.gcr.io/kube-proxy                v1.23.3   9b7cc9982109   6 months ago    112MB
7k8s.gcr.io/etcd                      3.5.1-0   25f8c7f3da61   9 months ago    293MB
8k8s.gcr.io/coredns/coredns           v1.8.6    a4ca41631cc7   10 months ago   46.8MB
9k8s.gcr.io/pause                     3.6       6270bb605e12   11 months ago   683kB

安装 Master 节点

kubeadm 的用法非常简单,只需要一个命令 kubeadm init 就可以把组件在 Master 节点上运行起来, 不过它还有很多参数用来调整集群的配置,你可以用 -h 查看。这里我只说一下我们实验环境用到的 3 个参数: –pod-network-cidr,设置集群里 Pod 的 IP 地址段。 –apiserver-advertise-address,设置 apiserver 的 IP 地址,对于多网卡服务器来说很重要(比如 VirtualBox 虚拟机就用了两块网卡),可以指定 apiserver 在哪个网卡上对外提供服务。 对外提供的ip ,我这里就是虚拟机ip 192.168.56.80 –kubernetes-version,指定 Kubernetes 的版本号。

1sudo kubeadm init \
2    --pod-network-cidr=10.10.0.0/16 \
3    --apiserver-advertise-address=192.168.56.80 \
4    --kubernetes-version=v1.23.3

提示如下

 1To start using your cluster, you need to run the following as a regular user:
 2
 3  mkdir -p $HOME/.kube
 4  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 5  sudo chown $(id -u):$(id -g) $HOME/.kube/config
 6
 7Alternatively, if you are the root user, you can run:
 8
 9  export KUBECONFIG=/etc/kubernetes/admin.conf
10
11You should now deploy a pod network to the cluster.
12Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
13  https://kubernetes.io/docs/concepts/cluster-administration/addons/
14
15Then you can join any number of worker nodes by running the following on each as root:
16
17# 其他节点要加入的命令
18kubeadm join 192.168.56.80:6443 --token zirl4o.ym14t5jq5m1crwzn \
19	--discovery-token-ca-cert-hash sha256:6e847e42fc7ac41c96ba9e9dae8ab2e52f0c9f767d077cbcb7d528e7a49fb3c7
1kubectl get node 
2# 这时 status 为 NotReady ,是因为网络还没好
3
4
5sudo kubeadm reset # 重置集群

安装 Flannel 网络插件(作废)

Kubernetes 定义了 CNI 标准,有很多网络插件,这里我选择最常用的 Flannel,可以在它的 GitHub 仓库里(https://github.com/flannel-io/flannel/)找到相关文档。 它安装也很简单,只需要使用项目的“kube-flannel.yml”在 Kubernetes 里部署一下就好了。 不过因为它应用了 Kubernetes 的网段地址,你需要修改文件里的“net-conf.json”字段, 把 Network 改成刚才 kubeadm 的参数 –pod-network-cidr 设置的地址段。

1wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

vim kube-flannel.yml 修改 net-confi.json这里 改成10.10.0.0/16

1  net-conf.json: |
2    {
3      "Network": "10.10.0.0/16",
4      "Backend": {
5        "Type": "vxlan"
6      }
7    }
1kubectl apply -f kube-flannel.yml

稍等一小会,等镜像拉取下来并运行之后,你就可以执行 kubectl get node 来看节点状态:

1vagrant@master:~$ kubectl get node
2NAME     STATUS   ROLES                  AGE     VERSION
3master   Ready    control-plane,master   9m42s   v1.23.3

这时你应该能够看到 Master 节点的状态是“Ready”,表明节点网络也工作正常了。

安装calico网络插件

1# https://github.com/cr-mao/develop_study/blob/main/k8s_install/calico.yaml
2kubectl apply -f calico.yaml

安装 Worker 节点

拷贝的那条 kubeadm join 命令就可以了,记得要用 sudo 来执行

1sudo kubeadm join 192.168.56.80:6443 --token zirl4o.ym14t5jq5m1crwzn \
2	--discovery-token-ca-cert-hash sha256:6e847e42fc7ac41c96ba9e9dae8ab2e52f0c9f767d077cbcb7d528e7a49fb3c7

等会执行, 已经ready了

1vagrant@master:~$ kubectl get nodes
2NAME     STATUS   ROLES                  AGE   VERSION
3master   Ready    control-plane,master   22m   v1.23.3
4node1    Ready    <none>                 56s   v1.23.3
5node2    Ready    <none>                 59s   v1.23.3

master 节点运行一个pod 来测试

1kubectl run ngx --image=nginx:alpine
1vagrant@master:~$ kubectl get pod -o wide
2NAME   READY   STATUS    RESTARTS   AGE   IP          NODE    NOMINATED NODE   READINESS GATES
3ngx    1/1     Running   0          20s   10.10.2.2   node1   <none>           <none>

work节点也能执行kubectl

1mkdir -p $HOME/.kube
2sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
3sudo chown $(id -u):$(id -g) $HOME/.kube/config

将 master 的 ~/.kube/config 拷贝到work节点 ~/.kube/config

1#k8s-01 master节点 , /home/www 是共享目录 
2cp ~/.kube/config /home/www
3
4
5#k8s-02,k8s-03 节点运行
6mkdir  ~/.kube
7cp /home/www/config  ~/.kube/

node1也已经能运行了,同理node2节点

1vagrant@node1:~$ kubectl get pod -o wide
2NAME   READY   STATUS    RESTARTS        AGE   IP          NODE    NOMINATED NODE   READINESS GATES
3ngx    1/1     Running   1 (5m35s ago)   18m   10.10.2.3   node1   <none>           <none>

官方 dashboard 部署

  1. 第一步 kubectl apply -f dashboard-adminuser.yaml ,

    dashboard-adminuser.yaml内容如下 ,给权限, 不然进去 提示没各种权限

 1---
 2apiVersion: v1
 3kind: Namespace
 4metadata:
 5  name: kubernetes-dashboard
 6---
 7apiVersion: v1
 8kind: ServiceAccount
 9metadata:
10  name: admin-user
11  namespace: kubernetes-dashboard
12---
13apiVersion: rbac.authorization.k8s.io/v1
14kind: ClusterRoleBinding
15metadata:
16  name: admin-user
17roleRef:
18  apiGroup: rbac.authorization.k8s.io
19  kind: ClusterRole
20  name: cluster-admin
21subjects:
22- kind: ServiceAccount
23  name: admin-user
24  namespace: kubernetes-dashboard
  1. 第二步

https://github.com/kubernetes/dashboard

需要在下载来的文件中改这个

type: NodePort

(我改好的文件recommended.yaml)

1kubectl get service -A
2
3kubernetes-dashboard   kubernetes-dashboard        NodePort    10.105.167.219   <none>        443:31659/TCP            9m13s
4
5主机ip:31659 即可
6用firefox浏览器打开
1#访问测试
2每次访问都需要令牌
3kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

kuboard 第三方集群管理界面部署

1kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
2
3# kubectl apply -f kuboard-v3.yaml

安装过程中 ubuntu镜像拉取不下来问题解决

幸运的是我mac 可以 拉下来

1# 镜像导出文件
2docker save eipwork/kuboard-agent:v3 > kuboard-agentv3.tar
3# 镜像倒入
4sudo docker load < kuboard-agentv3.tar

http://192.168.56.80:30080/

账号密码 admin Kuboard123

我的安装脚本仓库

Ubuntu 22.04换国内源 清华源 阿里源 中科大源 163源

实际搭建多节点的Kubernetes集群-极客时间

一些shell脚本可以参考

apt key问题

ubuntu dns问题