使用Kubespray安装k8s集群

GitHub: https://github.com/chanjarste...

使用Kubespray安装k8s集群

本文撰写时,Kubespray的master分支不稳定,请使用release版本来安装,具体来说就是切换到最新的tag上。

准备好target nodes

  1. 准备好几台服务器,假设你准备了3台。
  2. 给每个node安装好操作系统,Ubuntu 16.04 Server LTS或者CentOS 7,并且有一个可以sudo的用户或者直接有root用户。
  3. 确保每个node都安装了python 2.7
  4. 在每个node上开启IPv4 Forwarding,修改/etc/sysctl.conf,然后重启。可参考这篇文章

    net.ipv4.ip_forward = 1

执行Kubespray

找一台服务器,用来执行Kubespray,Kubespray的原理是通过ssh连接到各个target nodes执行命令安装k8s集群。

  1. 将服务器的.ssh/id_rsa.pub上传到target nodes:
    ssh-copy-id user@target-node-host
  2. 在Kubespray所在的机器上安装bash-git-prompt
  3. 到Kubespray项目仓库下载代码:
    git clone https://github.com/kubernetes-incubator/kubespray.git
  4. 使用中科大docker image mirror地址,运行以下命令:

    • find . -name '*.yml' | xargs -n1 -I{} sed -i 's/gcr\.io\/google-containers\//gcr\.mirrors\.ustc\.edu\.cn\/google-containers\//' {}
    • find . -name '*.yml' | xargs -n1 -I{} sed -i 's/gcr\.io\/google_containers\//gcr\.mirrors\.ustc\.edu\.cn\/google-containers\//' {}
    • find . -name '*.yml' | xargs -n1 -I{} sed -i 's/quay\.io/quay\.mirrors\.ustc\.edu\.cn/' {}

如果中科大地址不行,请更换anjia0532的地址

    • find . -name '*.yml' | xargs -n1 -I{} sed -i 's/gcr\.io\/google-containers\//anjia0532\/google-containers\./' {}
    • find . -name '*.yml' | xargs -n1 -I{} sed -i 's/gcr\.io\/google_containers\//anjia0532\/google-containers\./' {}
    1. 修改roles/docker/defaults/main.yml文件,设置docker仓库的镜像:

      docker_ubuntu_repo_base_url: "http://mirrors.aliyun.com/docker-ce/linux/ubuntu"
      docker_ubuntu_repo_gpgkey: "http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg"
      dockerproject_apt_repo_base_url: "https://mirrors.tuna.tsinghua.edu.cn/docker/apt/repo"
      dockerproject_apt_repo_gpgkey: "https://mirrors.tuna.tsinghua.edu.cn/docker/apt/gpg"
    2. 确保Kubespray所载机器上已经安装了pip
    3. 在执行ansible-playbook命令之前修改inventory/mycluster/group_vars/k8s-cluster.yml文件:

      • efk_enabled: true
      • ingress_nginx_enabled: true
      • kubeconfig_localhost: true
      • kubectl_localhost: true
    4. 修改roles/network_plugin/calico/defaults/main.yml文件里的calico_mtu参数,根据官方文档给每个服务器设置MTU。简单来说就是kubespray默认为calico启用了IP-in-IP模式,那么它的MTU应该是网卡MTU-20。
    5. 根据项目仓库的指南执行命令
    6. 安装完毕后,找到inventory/mycluster/artifacts/admin.conf文件,copy到~/.kube/config文件,然后你就可以在Kubespray机器上使用kubectl管理k8s了

    Troubleshooting

    提示Permission denied之类的错误

    可能是执行Ansible playbook的时候,ssh到target node执行某些命令缺少root权限。

    在教程的最后一步ansible-playbook -i inventory/mycluster/hosts.ini cluster.yml,根据情况添加-b --become-user --become-method等参数。

    写本文时target node是ubuntu cloud image,所以只需添加-b参数就行了。其余情况请自行摸索。

    同时也要记得添加-u 用户名参数。

    提示unable to resolve host

    这是因为每个target node有一个hostname,但是在/etc/hosts下没有配置造成的,修改每个target node的/etc/hosts,比如:

    127.0.0.1 localhost kube-1
    提示FAILED! ip in ansible_all_ipv4_addresses

    这种错误出现在云环境中,target node有两个IP,一个是内部IP(外部不能访问),一个是外部IP(在OpenStack环境下就是一个是Project network IP,一个是Floating IP)。

    这个时候需要修改inventory/mycluster/hosts.ini,把node的IP属性改成内部IP,比如下面这种:

    [all]
    node1 ansible_host=172.50.10.2 ip=192.168.1.4
    node2 ansible_host=172.50.10.13 ip=192.168.1.8
    node3 ansible_host=172.50.10.15 ip=192.168.1.9
    
    ...

    用kubectl访问

    在master-node下可以用kubectl来访问k8s,但这有点麻烦,实际上你能够在任意机器上安装kubectl然后远程访问。

    方法很简单将之前提到的.kube/config放到你自己电脑(假设你用的是MAC或者Linux系统)的目录下,就可以了。

    注意:在OpenStack环境下,每个node会被分配一个Floating IP,会导致你kubectl无法使用,这个时候需要你这样做:

    • 注释.clusters.cluster.certificate-authority-data
    • 添加.clusters.cluster.insecure-skip-tls-verify: true
    • 修改.clusters.cluster.server的IP地址到一个能够外部访问的IP地址(这种情况出现在OpenStack环境下的Floating IP)

    访问Dashboard

    如果都安装成功,那么你可以访问k8s dashboard来看看安装结果。打开浏览器,访问https://{某个master的IP}:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/,你会被要求登录,你得先创建一个用户并。

    但是Kubespray并没有替你创建用户,所以请根据这篇guide来创建用户,然后获得Token,使用Token登录。

    下面讲解主要步骤:

    1. 创建admin-user用户。

      1. 新建一个文件名字叫做admin-user.yaml,内容如下:

        apiVersion: v1
        kind: ServiceAccount
        metadata:
          name: admin-user
          namespace: kube-system
      2. 在kube-master上运行kubectl create -f admin-user.yaml
    2. 绑定角色:

      1. 新建一个文件名字叫做admin-user-role.yaml,内容如下:

        apiVersion: rbac.authorization.k8s.io/v1
        kind: ClusterRoleBinding
        metadata:
          name: admin-user
        roleRef:
          apiGroup: rbac.authorization.k8s.io
          kind: ClusterRole
          name: cluster-admin
        subjects:
        - kind: ServiceAccount
          name: admin-user
    3. 获得token:

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

    
    [calico-mtu]: https://docs.projectcalico.org/v2.2/usage/configuration/mtu
    [kubespray-repo]: https://github.com/kubernetes-incubator/kubespray
    [bash-git-prompt]: https://github.com/magicmonty/bash-git-prompt
    [enable-ipv4-forwarding]: http://www.ducea.com/2006/08/01/how-to-enable-ip-forwarding-in-linux/
    [k8s-dashboard-create-user]: https://github.com/kubernetes/dashboard/wiki/Creating-sample-user
    [anjia0532-mirror]: https://github.com/anjia0532/gcr.io_mirror

    颇忒脱
    Java方面的专栏

    Apache Committer

    4.2k 声望
    242 粉丝
    0 条评论
    推荐阅读
    记一次K8S VXLAN Overlay网络8472端口冲突问题的排查
    在20-22三台上安装K8S集群(通过rancher的rke安装),安装完毕后,发现访问各个节点的80端口,只有20服务器能够正常返回,其余的都是Gateway Timeout。使用Rancher的提供的这个办法得知Overlay网络不通。

    chanjarster2阅读 3k

    Helm3-安装RabbitMQ
    最近在使用k8s搭建微服务时,发现需要手动修改yaml文件里面的pod name、pod image、svc name、ingress tls等等,非常麻烦,但是有了helm之后情况就不一样了,helm是k8s的包管理器,类似ubuntu的apt-get,centos的...

    Awbeci阅读 9.6k

    Kubernetes Gateway API 深入解读和落地指南
    Kubernetes Gateway API 是 Kubernetes 1.18 版本引入的一种新的 API 规范,是 Kubernetes 官方正在开发的新的 API,Ingress 是 Kubernetes 已有的 API。Gateway API 会成为 Ingress 的下一代替代方案。Gateway A...

    Rainbond2阅读 439

    Jvm调优与微服务资源分配
    在没有接触微服务之前,我们的java程序一般都部署在WebLogic、Tomcat这类应用服务器上,这些应用服务器本身也是基于Jvm虚拟机的。一般我们统一对应用服务器做Jvm参数调优(分配多大内存,线程池限制等),而不用...

    KerryWu阅读 6.1k

    K8S-使用Helm安装RabbitMQ和Redis的总结
    记得去年2021上半年的时候自学了k8s并且使用helm安装了rabbitmq和redis,可以在开发、测试和生产环境上用起来,但是下半年之后就没有用,再拾起来的时候发现好多知识点都忘了,这篇文章就是总结使用helm安装rabbm...

    Awbeci1阅读 1.9k

    Kubernetes v1.27 新特性一览
    Kubernetes v1.27 是 2023 年的第一个大版本更新,包含了近 60 项主要的更新。 而 1.26 只有 37 项,所以这个版本可以说是一个变化非常显著的版本了。

    张晋涛1阅读 1.1k

    封面图
    实战:用“廉价”的NFS作为K8S后端存储
    大家都知道,NFS是一种基于网络的文件系统协议,允许在不同的机器之间共享文件系统资源。在K8S中,可以使用NFS作为后端存储,以提供持久化存储和共享存储卷。但是否适合在生产环境使用NFS作为后端存储,这取决于...

    不背锅运维2阅读 757

    Apache Committer

    4.2k 声望
    242 粉丝
    宣传栏