• 使用Kubeadm安装Kubernetes【单Master节点】


    参考:Kubernetes官方文档

       Kubernetes安装方案选择

         Centos 7 配置科学上网

             安装Calico网络插件

             kubernetes-dashboard部署

    Kubernetes安装,遇到的问题,很大部分是无法获取官方依赖镜像造成。可以选择合适的方式避开镜像获取失败问题。

    比如:

    1. 服务器http proxy科学上网【本文使用】

    2. 服务器使用的网关可以科学上网

    3. 将Kubernetes安装涉及到的docker镜像提前下载至私库(比如docker hub), 并修改安装中涉及到的yaml文件,将其中镜像修改为私库中的镜像名称。

    上述方案3,本人有尝试过使用内网的Docker Registry私库,使用IP+端口Http传输镜像,kubernetes安装过程中出现Https握手失败的提示,导致安装失败。

     环境

    本次安装使用2台VMware虚拟机,Centos7 64位操作系统,安装Kubernetes版本为1.11.1。对于Kubernetes可以选择差不多的版本,比如1.10.x。

    另外,本文涉及的操作用户是root账户。

    本次部署为一个master节点,一个node节点。按需可以添加多个node节点,方法一样。

    IP地址 HostName 操作系统 备注
    172.16.78.243 k8s-master Centos7 64位 k8s master节点
    172.16.78.244 k8s-node1 Centos7 64位 k8s node 节点
           

    服务器环境初始化

    1. 配置服务器科学上网

    参考Centos 7 配置科学上网

    将ssinit,sson,ssoff 写入bashrc:

    a. 修改~/.bashrc

    b. 添加以下内容:

    alias ssinit='nohup sslocal -c /etc/shadowsocks.json &>> /var/log/sslocal.log &'
    alias sson='export http_proxy=http://127.0.0.1:8118 && export https_proxy=http://127.0.0.1:8118 && systemctl start privoxy'
    alias ssoff='unset http_proxy && unset https_proxy && systemctl stop privoxy && pkill sslocal'

    c. 修改生效:

    source ~/.bashrc

    配置过后,执行 ssinit,sson命令,curl www.google.com 确认是否访问正常。然后ssoff关闭代理。

    2. 关闭selinux

    #修改/etc/selinux/config,修改SELINUX为disabled
    vim /etc/selinux/config
    SELINUX=disabled
    
    #执行
    setenforce 0
    
    #重启
    reboot

    3. 修改各服务器上的/etc/hosts文件

    添加各服务器ip与主机名关系:

    172.16.78.243 k8s-master
    172.16.78.244 k8s-node1

    重启网络服务

    service network restart

    4. 各服务器时间同步

    #安装ntpdate
    yum install -y ntpdate
    #同步北京时间
    ntpdate -u cn.pool.ntp.org

    Master节点部署 

    1. 关闭交换空间

    a. free -h 查看是否有swap内存

    b. swapoff -a 永久关闭交换空间

    c. 注释/etc/fstab中swap条目

    d. 重启服务器

    2. mac地址和product_uuid要求在kubernetes集群中唯一

    ifconfig
    
    sudo cat /sys/class/dmi/id/product_uuid

    3. 内网环境,关闭防火墙,或者确保涉及到的端口开放

    4. 安装docker

    yum install -y docker
    
    systemctl enable docker && systemctl start docker

    如果启动docker出现:

    Error starting daemon: SELinux is not supported with the overlay2 graph driver on this kernel. Either boot into a newer kernel or disable selinux in docker (--selinux-enabled=false...
    类似错误,可以在docker中禁用selinux。
    修改/etc/sysconfig/docker,设置OPTIONS中 --selinux-enabled=false,然后systemctl restart docker重启docker。

    5. docker设置http代理【需要时设置

    该步骤,只在需要docker科学上网拉取镜像时使用。

    a. 服务已启动代理(ssinit,sson)

    b. 配置/etc/sysconfi/docker,添加代理地址

    c. systemctl restart docker

    备注:关闭docker http代理时,注释/etc/sysconfi/docker中的代理地址,systemctl daemon-reload,systemctl restart docker。

    6. 安装 kubelet,kubeadm

    本步骤涉及到的命令,务必使用Kubernetes官方文档中的命令,因为官网可能会更新。

    # 务必使用官方文档中的命令进行操作,此处仅供参考
    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpghttps://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    EOF
    
    setenforce 0
    yum install -y kubelet kubeadm kubectl  
    
    systemctl enable kubelet && systemctl start kubelet

    7. Master节点配置dcker cgrouop与kubelet一致

    a. 查看docker cgroup

       docker info | grep -i cgroup 查看docker的cgroup,本文中为systemd

    b. 修改kubelet配置

    vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
    修改内容参考下图

    c. 重启kubelet

    systemctl daemon-reload
    systemctl restart kubelet

    8. 修改路由规则

    # 务必使用官方文档中的命令进行操作,此处仅供参考
    cat <<EOF >  /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    
    sysctl --system
    systemctl daemon-reload
    systemctl restart kubelet

    9. 拉取需要用到的镜像

    a. 使用kubeadm config images list 列出需要的镜像

    k8s.gcr.io/kube-apiserver-amd64:v1.11.1
    k8s.gcr.io/kube-controller-manager-amd64:v1.11.1
    k8s.gcr.io/kube-scheduler-amd64:v1.11.1
    k8s.gcr.io/kube-proxy-amd64:v1.11.1
    k8s.gcr.io/pause:3.1
    k8s.gcr.io/etcd-amd64:3.2.18
    k8s.gcr.io/coredns:1.1.3

    b. 参考步骤docker设置http代理

    c. docker pull 依次拉取a中的镜像

    10 kubeadm init

    需要关闭服务器http代理,关闭docker http代理

    kubeadm init --pod-network-cidr=192.168.0.0/16  --kubernetes-version=v1.11.1 --apiserver-advertise-address=172.16.78.243

    --apiserver-advertise-address为master节点地址,--pod-network-cidr参数是网络插件Calico需要用到的 配置。

    11. 根据页面提示操作

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

    记录node节点加入集群命令,后期node节点安装需要使用,命令中的token 24小时后失效。

    kubeadm join 172.16.78.243:6443 --token sm4yzq.r7mwo1isrnrw2vyh --discovery-token-ca-cert-hash sha256:55989ef0da53df8ba12f9e9edef0474b351bd72b80c60dbc5eadf4ef5890c0b9

    12. 安装Calico网络插件

    参考安装Calico网络插件

    a. 安装单节点Calico & etcd

    kubectl apply -f 
    https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubeadm/1.7/calico.yaml

    b. 查看容器运行正常

    watch kubectl get pods --all-namespaces

    输出类似:

    NAMESPACE    NAME                                       READY  STATUS   RESTARTS  AGE
    kube-system  calico-etcd-x2482                          1/1    Running  0         2m
    kube-system  calico-kube-controllers-6ff88bf6d4-tgtzb   1/1    Running  0         2m
    kube-system  calico-node-24h85                          2/2    Running  0         2m
    kube-system  etcd-jbaker-virtualbox                     1/1    Running  0         6m
    kube-system  kube-apiserver-jbaker-virtualbox           1/1    Running  0         6m
    kube-system  kube-controller-manager-jbaker-virtualbox  1/1    Running  0         6m
    kube-system  kube-dns-545bc4bfd4-67qqp                  3/3    Running  0         5m
    kube-system  kube-proxy-8fzp2                           1/1    Running  0         5m
    kube-system  kube-scheduler-jbaker-virtualbox           1/1    Running  0         5m

    CTRL + C 推出watch命令

    c. 关闭Master节点的taints

    kubectl taint nodes --all node-role.kubernetes.io/master-

    输出类似:

    node "<your-hostname>" untainted

    d. 确认运行状态

    kubectl get nodes -o wide

    输出类似:

    NAME             STATUS  ROLES   AGE  VERSION  EXTERNAL-IP  OS-IMAGE            KERNEL-VERSION     CONTAINER-RUNTIME
    <your-hostname>  Ready   master  1h   v1.8.x   <none>       Ubuntu 16.04.3 LTS  4.10.0-28-generic  docker://1.12.6

    13. 其他

    kubeadm tear down后,可重新kubeadm init 或 kubeadm join

    kubectl drain <node name> --delete-local-data --force --ignore-daemonsets  #master上运行
    kubectl delete node <node name> #master上运行
    kubeadm reset  #被删节点上运行
    rm -rf ~/.kube/   #重置master节点时运行

    Node节点部署

    1. kubeadm,kubelet部署

    服务器按照master节点安装,执行至步骤9,不需要执行kubeadm init命令

    2. docker http代理,拉取依赖镜像

    quay.io/calico/cni:v3.1.3
    quay.io/calico/node:v3.1.3
    k8s.gcr.io/kube-proxy-amd64:v1.11.1
    k8s.gcr.io/pause:3.1

    3. 加入Kubernetes集群

    需要关闭服务器http代理,关闭docker http代理

    执行安装master节点时记录的join命令

    kubeadm join 172.16.78.243:6443 --token 2mn34f.q366f43n7nh0tjed --discovery-token-ca-cert-hash sha256:55989ef0da53df8ba12f9e9edef0474b351bd72b80c60dbc5eadf4ef5890c0b9

    4. 在master节点验证

    kubectl get nodes

    5. 其他

    master节点的token 24小时过期后,可以通过命令产生新的token:

    kubeadm token create

    master节点上运行命令,可查询token:

    kubeadm token list

    master节点上运行命令,可查询discovery-token-ca-cert-hash值:

    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | 
       openssl dgst -sha256 -hex | sed 's/^.* //'

    kubernetes-dashboard部署

    参考 kubernetes-dashboard部署,kubernetes-dashboard版本为v1.8.3。

    备注:kubectl delete -f xxx.yaml可以移除对于xxx.yaml安装的dashboard。

    • 部署

    1. 使用国内私库的dashboard镜像

    registry.cn-hangzhou.aliyuncs.com/jonny/kubernetes-dashboard-amd64:v1.8.3

    2. master节点,下载kubernetes-danboard.yaml,修改镜像为上一步中国内镜像

    wget  http://mirror.faasx.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

    3. 安装

    kubectl apply -f kubernetes-dashboard.yaml

    4. 查看启动状态

    kubectl get pods --all-namespaces

    5. Master节点本机访问【跳过该步骤

    kubectl proxy
    Master服务器浏览器访问
     
    • 创建用户

    1. 创建admin用户

    新建admin-user.yaml文件,内容如下:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: admin-user
      namespace: kube-system

    执行创建命令:

    kubectl create -f admin-user.yaml

    2. 绑定角色

    新建admin-user-role-binding.yaml文件,内容如下:

    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
      name: admin-user
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
    - kind: ServiceAccount
      name: admin-user
      namespace: kube-system

    执行创建命令:

    kubectl create -f admin-user-role-binding.yaml

    3. 获取该admin用户的访问token

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

    Token:

    eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTh6anhsIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIxODNhMGZhYi05MGI0LTExZTgtODQwNy0wMDBjMjk3ZDJiNmEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.VPjQ7FlYOH6Y6UM1e3btIknQ9vFLjQfRGfvebTvML0dYjem1my8HsEAG8hVmz8IPQh9btLwwAuCq0Rxcp5ApuKVXmFfGN5r6ej3k4hvzsEjKAPGgOzY3N3u_YdIMxw_hgbppcF8wIk8433ruz_uSrFo7x5Rve7XMAK2qlsTEJG5YxOJktfkSEPNVnHz92KicrjlIdDF8wANpJisVkdaNeSCbFaYMKWEarp_2OuZ8wzt-HVfyMgcE1Pc045wH7goXQQ0n2kJtcsTgc3X3XoTEsbG_p188OIA_MBc1k68AeycAUFm-nf1Ugn65h0GIRHw1hITmPX8iyD-H_nMfLitpVA
    • 集成Heapster插件

    kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/influxdb.yaml
    kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/grafana.yaml
    kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/heapster.yaml
    kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/rbac/heapster-rbac.yaml

    使用的yaml文件是 https://github.com/kubernetes/heapster/tree/master/deploy/kube-config/influxdb 的国内镜像

    • 访问Dasshboard

    本文使用的是参考文档中的API Server访问dashboard方式,可在master节点服务器外访问。用户需要安装证书访问dashboard。

    1. kubectl cluster-info 查看相关信息

    Kubernetes master is running at https://172.16.78.243:6443
    KubeDNS is running at https://172.16.78.243:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
    
    To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

    2. 浏览器访问dashboard

    IP和端口使用上一步中的返回值对应IP和端口

    https://172.16.78.243:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

    此时浏览器返回403错误:

    {
      "kind": "Status",
      "apiVersion": "v1",
      "metadata": {
        
      },
      "status": "Failure",
      "message": "services "https:kubernetes-dashboard:" is forbidden: User "system:anonymous" cannot get services/proxy in the namespace "kube-system"",
      "reason": "Forbidden",
      "details": {
        "name": "https:kubernetes-dashboard:",
        "kind": "services"
      },
      "code": 403
    }

    3. 创建证书

    # 生成client-certificate-data
    grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt
    
    # 生成client-key-data
    grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key
    
    # 生成p12
    openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"

    4. 导入证书

    客户端浏览器导入p12证书,重启浏览器

    如果Chrome版本过新导致无法访问页面,可以使用firefox尝试。

    5. 访问dashboard

    选择token登入,输入之前admin用户的token

    https://172.16.78.243:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

    现在可以在环境上验证kubernetes相关操作了。

  • 相关阅读:
    linux基础学习6
    Linux基础学习5
    Linux基础学习4
    Linux基础学习3
    Linux基础学习2
    ASP.NET MVC学习——控制器传递数据到view的简单案例
    转载:URL链接中的不同用处
    MVC学习的心路历程
    45道SQL数据题详细超基础解析
    结束基础,开始MVC之旅!
  • 原文地址:https://www.cnblogs.com/xieyifeng/p/9383236.html
Copyright © 2020-2023  润新知