kubernetes基础01:kubeadm部署kubernetes1.17

SRE技术栈  ·  2020-10-25

k8s部署步骤

1.至少2台,建议3台或以上。
2.没有需要FQ拉取镜像的问题,也没有要事先准备镜像的麻烦
3.只需30-45分钟解决部署难题,快速入门
4.文章根据实验整理保证有效
  1. 设定主机名,将所有的机器名写入到所有机器的/etc/hosts文件
  2. 禁用所有主机的swap:

    swapoff -a
    echo vm.swappiness=0 >> /etc/sysctl.conf; sysctl -p
    
    #禁止开机自动加载swap分区
    vim /etc/fstab
    #UUID=07bddd02-1748-4049-8373-f68962916061 swap   swap    defaults    0 0
  3. 关闭防火墙、selinux

  4. sysctl调整

    cat <<EOF >  /etc/sysctl.d/k8s.conf
     net.bridge.bridge-nf-call-ip6tables = 1
     net.bridge.bridge-nf-call-iptables = 1
     net.ipv4.ip_forward = 1
    EOF
    sysctl --system
  5. 安装docker; 使用国内yum源;

    yum install -y yum-utils
    yum-config-manager --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #使用阿里的源
    yum makecache fast
    yum install -y  docker-ce
    
    #//调整docker cgroup driver;
    cat /etc/docker/daemon.json 
    {
    "exec-opts": [ "native.cgroupdriver=cgroupfs" ]
    }
    docker info|grep -i driver   #确认cgroupdriver
  6. 安装k8s工具; 使用国内yum源;

    # 使用国内yum源
    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    
    master: yum install -y kubeadm  kubelet kubectl kubernetes-cni  // 其他不必安装
    node:   yum install -y kubeadm  kubelet         kubernetes-cni  // 其他不必安装
    
    source <(kubectl completion bash )  #master做
    
  7. kubeadm init

    master上执行
    kubeadm init \
     --apiserver-advertise-address=192.168.1.42 \
     --image-repository registry.aliyuncs.com/google_containers \
     --pod-network-cidr=10.244.0.0/16
     #如果pod状态异常,可能是因为node还未加入的问题,等待一会再看
    
    根据kubeadm init的返回提示,配置kubectl的配置文件
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
  8. kubeadm jon

    所有node上执行
    # kubeadm token create --print-join-command #master上重新获取join的命令,复制命令在node上执行

9.kubelet默认配置的坑

所有机器上执行
# 调整--cgroup-driver: 确保和docker配置的一致(docker info|grep -i driver)
cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd  --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.1 --resolv-conf=/run/systemd/resolve/resolv.conf"

systemctl restart kubelet  #需要重启kubelet
  1. 确认所有节点都为ready状态

    kubectl get nodes -o wide
  2. 部署flannel导入flanneld的yml文件;

    master上执行
    #cni:不用特殊处理, 只需安装上kubernetes-cni即可。
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  3. k8s测试

    master上执行
    kubectl run nginx --image=nginx --replicas=3
    kubectl expose deployment nginx --port=88 --target-port=80 --type=NodePort
    
    # kubectl describe svc/nginx
    Name:                     nginx
    Namespace:                default
    Labels:                   run=nginx
    Annotations:              <none>
    Selector:                 run=nginx
    Type:                     NodePort
    IP:                       10.109.197.81    #cluster ip
    Port:                     <unset>  88/TCP  #cluster port
    TargetPort:               80/TCP           #pod port
    NodePort:                 <unset>  30024/TCP  #NodePort
    Endpoints:                172.17.0.2:80,172.17.0.2:80,172.17.0.4:80
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:                   <none>
    
    kubectl get svc -o wide //查到端口
    curl http://nodeip:nodePort访问
  4. 导入dashboard

    master上执行
    #1.下载recommended.yaml
    wget "https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc6/aio/deploy/recommended.yaml"
    
    #2.调整recommended.yaml
    cat recommended.yaml
    ......
    kind: Service
    apiVersion: v1
    metadata:
      labels:
    k8s-app: kubernetes-dashboard
      name: kubernetes-dashboard
      namespace: kubernetes-dashboard
    spec:
      type: NodePort  #添加
      ports:
    - port: 443
      targetPort: 8443
      nodePort: 32000  #添加
      selector:
    k8s-app: kubernetes-dashboard
    ......
    
    kubectl apply -f recommended.yaml  #导入
    
    #3 添加鉴权信息
    vim dashboard-user.yaml   #添加该文件
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: admin-user
      namespace: kubernetes-dashboard
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: admin-user
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
  5. kind: ServiceAccount
    name: admin-user
    namespace: kubernetes-dashboard

    kubectl apply -f dashboard-user.yaml #导入

    4访问dashboard

    https://nodeip:32000访问

    获取鉴权字串

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

    至此,k8s搭建完毕了, 终于可以愉快的玩耍了
    ![](https://upload-images.jianshu.io/upload_images/15624419-a3eed26b06e72ed0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

kubernetes dashboard

14.后记

k8s是我见过的最复杂的系统,就算是最小的子系统也很复杂;
部署也是k8s的一大问题,挡住了无数初学者的脚步。kubeadm可以很大程度上解决部署困难的问题。
个人觉得k8s系统中最难搞的是各个组件的学习,将各个组件给串联起来。其次是k8s的生态学习,各种工具各种周边系统。

 
评论
Glab. All Rights Reserved. Theme Jasmine by Kent Liao.