• kubernetes集群搭建总结


    1、安装kubelet、kubeadm、kubectl

    2、查看所需镜像

    命令:kubeadm config images list

    结果:
    k8s.gcr.io/kube-apiserver:v1.18.3
    k8s.gcr.io/kube-controller-manager:v1.18.3
    k8s.gcr.io/kube-scheduler:v1.18.3
    k8s.gcr.io/kube-proxy:v1.18.3
    k8s.gcr.io/pause:3.2
    k8s.gcr.io/etcd:3.4.3-0
    k8s.gcr.io/coredns:1.6.7

    3、下载镜像并保存到本地私有库

    从阿里云镜像仓库获取这些镜像:

    docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.18.2

    注意:通过命令获取到的都是最新的镜像版本,但阿里云可能没有最新的,比如我执行的时候给出的版本是1.18.3,但阿里云镜像只有1.18.2,所以就获取老版本镜像。

    都下载完成后,就打上自己私有库的tag,然后上传到私有库,这样其它机器部署时可以直接从私有库下载。

    docker tag k8s.gcr.io/kube-proxy:v1.18.2 192.168.31.151:5000/google_containers/kube-proxy:v1.18.2
    docker push 192.168.31.151:5000/google_containers/kube-proxy:v1.18.2

    docker tag k8s.gcr.io/kube-apiserver:v1.18.2 192.168.31.151:5000/google_containers/kube-apiserver:v1.18.2
    docker push 192.168.31.151:5000/google_containers/kube-apiserver:v1.18.2

    docker tag k8s.gcr.io/kube-controller-manager:v1.18.2 192.168.31.151:5000/google_containers/kube-controller-manager:v1.18.2
    docker push 192.168.31.151:5000/google_containers/kube-controller-manager:v1.18.2

    docker tag k8s.gcr.io/kube-scheduler:v1.18.2 192.168.31.151:5000/google_containers/kube-scheduler:v1.18.2
    docker push 192.168.31.151:5000/google_containers/kube-scheduler:v1.18.2

    docker tag k8s.gcr.io/pause:3.2 192.168.31.151:5000/google_containers/pause:3.2
    docker push 192.168.31.151:5000/google_containers/pause:3.2

    docker tag k8s.gcr.io/etcd:3.4.3-0 192.168.31.151:5000/google_containers/etcd:3.4.3-0
    docker push 192.168.31.151:5000/google_containers/etcd:3.4.3-0

    docker tag k8s.gcr.io/coredns:1.6.7 192.168.31.151:5000/google_containers/coredns:1.6.7
    docker push 192.168.31.151:5000/google_containers/coredns:1.6.7

    其它机器部署时可以执行如下脚本,直接从私有库全部获取。
    images=(
         kube-apiserver:v1.18.2
         kube-controller-manager:v1.18.2
         kube-scheduler:v1.18.2
         kube-proxy:v1.18.2
         pause:3.2
         etcd:3.4.3-0
         coredns:1.6.7
    )
    for imageName in ${images[@]} ; do
         docker pull 192.168.31.151:5000/google_containers/$imageName
         docker tag 192.168.31.151:5000/google_containers/$imageName k8s.gcr.io/$imageName
         docker rmi 192.168.31.151:5000/google_containers/$imageName
    done;

    4、初始化

    执行如下命令初始化
    kubeadm init --image-repository 192.168.31.151:5000/google_containers --kubernetes-version v1.18.2 --apiserver-advertise-address 192.168.31.151 --pod-network-cidr=222.222.0.0/16

    kubeadm init --image-repository 192.168.31.151:5000/google_containers --kubernetes-version v1.18.2 --apiserver-advertise-address 192.168.31.152  --pod-network-cidr=222.222.0.0/16

    以上这是两台机器的初始化命令。当然初始化之前还有其它步骤,比如关闭swap,防火墙放行端口,允许ipv4转发。

    在初始化命令几个参数的作用:

    --image-repository 192.168.31.151:5000/google_containers:指定私有仓库的地址,否则它又跑到不可访问的google仓库去获取。

    --kubernetes-version v1.18.2:指定kubernetes版本,否则它就按照最新版本号去仓库里下载镜像。

    --apiserver-advertise-address 192.168.31.151:指定apiserver的访问地址,否则它就指定为找到的一个网卡,多个网卡时就错了。

    --pod-network-cidr=222.222.0.0/16:指定pod的子网地址,注意这个地址不要与机器所在局域网地址重叠,比如网络插件calico的参考地址是192.168.0.0/16,但现在机器所在网段就是192.168.31.0,所以要变更下calico的子网地址,否则在创建dashboard时会导致无法访问地址为10.96.0.1的apiserver的服务。

    这里有对这个问题的说明:

    https://github.com/kubernetes/dashboard/issues/3709#issuecomment-479075477

    可以查看下service的地址:

    1592482205(1)

    通过如下命令查询的内容可以看到pod和service的子网段分布。

    kubectl -n kube-system edit cm kubeadm-config

    1592482411(1)

    当然如果不对参数--pod-network-cidr进行修改,仍然保持pod网段与主机网段重叠也没问题,起码初始化、运行及建立集群是没有问题的。

    当走到建立dashboard,无法访问10.96.0.1的apiserver服务时,也可以通过calico的控制台calicoctl重置配置pod的ippool,下面是官方切换ippool的操作说明。

    https://docs.projectcalico.org/networking/migrate-pools


    下面是wsl2下ubuntu的初始化命令。

    kubeadm init --image-repository 192.168.31.151:5000/google_containers --kubernetes-version v1.18.2 --apiserver-advertise-address 172.19.20.236  --apiserver-cert-extra-sans="192.168.31.146" --pod-network-cidr=222.222.0.0/16

    参数--apiserver-cert-extra-sans是上面其它机器初始化没有的,这是因为现在wsl2内虚拟机的ip是虚拟的,就是172.19.20.236,每次重启都会变化。在不重启的情况下,必须做端口转发后才能通过宿主主机ip从其它机器访问。端口转发后虽然能够连通,但是kubernetes初始化时生成的证书是给172.19.20.236的,我们通过宿主主机的192.168.31.146是无法访问,所以通过这个参数让kubernetes生成的证书也包括宿主主机的地址,从而也能通过宿主主机ip直接访问,当然这都是在使用wsl2时才会考虑的问题。

    5、安装网络插件

    采用网络插件calico,因为github上一直在更新。

    根据官方指导获取calico.yaml,并通过kubectl apply –f calico.yaml创建。

    将下载到的镜像打上本地标签,并上传至本地私有仓库。

    将calico.yaml中所有涉及的镜像都改成本地地址,这样重新安装时就直接从本地仓库下载镜像了。

    docker tag calico/node:v3.14.1 192.168.31.151:5000/calico/node:v3.14.1
    docker push 192.168.31.151:5000/calico/node:v3.14.1

    docker tag calico/pod2daemon-flexvol:v3.14.1 192.168.31.151:5000/calico/pod2daemon-flexvol:v3.14.1
    docker push 192.168.31.151:5000/calico/pod2daemon-flexvol:v3.14.1

    docker tag calico/cni:v3.14.1 192.168.31.151:5000/calico/cni:v3.14.1
    docker push 192.168.31.151:5000/calico/cni:v3.14.1

    docker tag calico/kube-controllers:v3.14.1 192.168.31.151:5000/calico/kube-controllers:v3.14.1
    docker push 192.168.31.151:5000/calico/kube-controllers:v3.14.1

    6、初始化kubectl访问

    执行下面命令,最好保存成脚本,以便于多次执行。
    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config

    为啥要执行上面这三行脚本呢?因为kubectl执行操作是需要读取.kube/config。kubectl只是一个客户端,任何对kubernetes的操作都是通过kubectl连上apiserver完成的。既然要连apiserver,就需要知道apiserver的地址,并且要表明自己的身份,apiserver才能允许你执行操作。在初始化创建apiserver时,会将apiserver的访问地址及客户端身份数据都放在etc/kubernetes/admin.conf中,这里只是将这个文件改成kubectl能访问的地址和名称。其它任何安装了kubectl的机器,只要在home目录下有这个配置文件,都能访问到这台机器的apiserver。

    查看/etc/kubernetes/admin.conf会看到,初始化参数--apiserver-advertise-address配置什么地址,这里就显示什么地址。

    7、设置master节点

    执行如下命令可以让master也被调度安装普通应用的pod,否则只有明确表明可以在master节点上调度的pod才可运行。

    kubectl taint node centos7-01 node-role.kubernetes.io/master:NoSchedule-

    执行之后可以让master节点既可调度又能执行部署应用pod。

    8、安装dashboard

    dashboard是kubernetes可视化的web管理应用,安装后方便查看kubernetes运行状态。

    按照官方说明通过kubectl apply部署,然后将下载到的镜像打标签上传到私有库以备用。

    docker tag kubernetesui/dashboard:v2.0.0 192.168.31.151:5000/kubernetesui/dashboard:v2.0.0
    docker push 192.168.31.151:5000/kubernetesui/dashboard:v2.0.0

    docker tag kubernetesui/metrics-scraper:v1.0.4 192.168.31.151:5000/kubernetesui/metrics-scraper:v1.0.4
    docker push 192.168.31.151:5000/kubernetesui/metrics-scraper:v1.0.4

    部署后的dashboard页面不能在master外的其它机器访问,必须通过apiserver访问。

    这个时候存储apiserver地址和客户端认证信息的/etc/kubernetes/admin.conf就又出来了。

    执行如下命令,通过提取其中的证书和密钥(应该是公钥),生成可导入浏览器的客户端证书。最后一步生成证书时需要设置密码,请牢记,因为后边导入浏览器时还需要输入这个密码。
    grep 'client-certificate-data' /etc/kubernetes/admin.conf | head -n 1 | awk '{print $2}' | base64  -d > kubernetes-client.crt
    grep 'client-key-data' /etc/kubernetes/admin.conf | head -n 1 | awk '{print $2}' | base64 -d > kubernetes-client.key
    openssl pkcs12 -export -clcerts -inkey kubernetes-client.key -in kubernetes-client.crt -out kubernetes-client.p12 -name "kubernetes-client"

    通过上面的命令获取了客户端证书,访问时apiserver能够验证访问者的合法身份了,那浏览器如何验证服务器身份呢?这时候后就需要kubernetes初始化时生成的根证书了,就是/etc/kubernetes/pki/ca.crt,下载该根证书并导入浏览器的受信任根证书颁发机构下,这样访问时客户端与服务器就都能互相验证真伪了。

    kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

    dashbaord-token:
    eyJhbGciOiJSUzI1NiIsImtpZCI6InJvUFVwYWtfcmc4RWJsRUlpcm5qb3YxcEpNQ1JyczVrSWRnZ3NfdklPeXMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWJ3Nzk5Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIwMWIyMjAwMC0wYzYzLTQ0ZDUtODIxZi02YzVlYmQ2MDI3MWMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.WQaTiFR7ivOtdS7B30gniUuhmFq-EIs7L8RBdtPNdMr2_Giwp9XdtonXCUpbALgshtpjDG8OYkqUmVOmVgs6rbNMgzP_gY8zXu7ykuYETBZuEqoWNyKfAdhgbINS4wQneoBpI9Co76vZCO5IOsmW-Rn0QRaEiK_oWOg8uUtKv4_HkamdoZISRwGwzE90jbMuyWIEnnhEwJjLDvPqcp3NnlkXqjr0mJzTHCN6X26rZRJ3IijNb_7Ak9fR3O3lwfJtfiKp7uw33Twl2yzXGB3eLyYU5dNHvKzn6JHt77FM3hAUtI1b2bbR8_NTZin2nqjmB1mpwg7mnAUlBtHWDjasAw

    rm /etc/kubernetes/* -r
    rm /var/lib/etcd/* -r
    rm /var/lib/kubelet/pki/kubelet* -r
    rm /var/lib/cni/* –r


    echo 1 > /proc/sys/net/ipv6/conf/default/disable_ipv6
    echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6

    /etc/sysctl.conf
    net.ipv6.conf.all.disable_ipv6=1
    net.ipv6.conf.default.disable_ipv6=1

    kubeadm join 192.168.31.151:6443 --token l14hlx.fpp1flxecssyma2j --discovery-token-ca-cert-hash sha256:fdf60fb3d79faf7d036dc63d7a2bea7286b7e66a3f77c8e50ee2a7b05dfbec23

    kubectl drain centos-vm-homepc-02 --delete-local-data --force --ignore-daemonsets
    kubectl delete node centos-vm-homepc-02

  • 相关阅读:
    pip install报错:RuntimeError: Python version >= 3.5 required
    简明conda使用指南
    Ninja使用Visual Studio(cl.exe)构建
    cmake设定boost python3
    系统程序员成长计划——像机器一样思考(二)
    在Redis Sentinel环境下,jedis该如何配置
    如何用Go语言实现汉诺塔算法
    pt-online-schema-change的实现原理
    MySQL Sniffer
    如何利用docker快速构建MySQL主从复制环境
  • 原文地址:https://www.cnblogs.com/StarkBrothers/p/13159550.html
Copyright © 2020-2023  润新知