搭建Kubernetes集群的三种方式

  K8S部署三种方式:
    minikube
      用在测试

    kubeadm部署(主要用在测试线,搭建简单,但现在发展很好也可以用在生产)
       kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。
       官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

    二进制部署(主要用在生产)
      推荐安装,从github下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。
      kubeadm降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。

Kubeadm方式搭建

 一、准备环境

1.1 服务器要求:
    1、三台服务器:1个master:192.168.50.10,2个node:192.168.50.11、192.168.50.13  建议最小硬件配置:2核cpu、2G内存、30G硬盘
    2、可以访问外网
    3、服务器之间网络互通(在一个网段)
    4、安装阿里云yum源(阿里云yum可以下载k8s的flannel组件)
    
1.2 软件环境:centos7.x_x64、docker-ce v20、k8s v1.22.3
1.3 服务器整体规划
    单master集群

二、服务器环境初始化

关闭防火墙(清空防火墙规则)
    systemctl stop firewalld
    systemctl disable firewalld
关闭selinux(关闭安全机制)
    setenforce 0                   #临时关闭
    sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config  #永久
关闭swap(必须关闭)
    swapoff -a                  #临时关闭
    sed -ri 's/.*swap.*/#&/' /etc/fstab            #永久
设置hostname
    192.168.50.10
        hostnamectl set-hostname k8s-master
    192.168.50.11
        hostnamectl set-hostname k8s-node1
    192.168.50.13
        hostnamectl set-hostname k8s-node2
添加host:(在host文件末尾添加)
    cat >> /etc/hosts <<EOF
    192.168.50.10 k8s-master
    192.168.50.11 k8s-node1
    192.168.50.13 k8s-node2
    EOF
将桥接的ipv4流量传递到iptables的链:
    cat > /etc/sysctl.d/k8s.conf <<EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    
    sysctl --system   #生效
时间同步:
    yum install -y ntpdate
    ntpdate us.pool.ntp.org

添加k8s yum源
    cat >/etc/yum.repos.d/kubernetes.repo << EOF
    [kubernetes]
    name=Kubernetes Repo
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
    https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF

安装kubelet、kubeadm、kubectl
    yum install -y kubelet-1.22.3 kubeadm-1.22.3 kubectl-1.22.3
    systemctl enable kubelet

三、快速部署K8S集群

master节点
    kubeadm init \
    --apiserver-advertise-address=192.168.50.10 \
    --image-repository registry.aliyuncs.com/google_containers \
    --kubernetes-version=v1.22.3 \
    --service-cidr=10.96.0.0/12 \
    --pod-network-cidr=10.244.0.0/16
        
    kubeadm init的引导过程:
        检查系统环境是否满足
        下载镜像
        为kubelet创建配置文件并启动
        为apiserver、etcd生成证书(/etc/kubernetes/pki)
        生成连接apiserver的kubeconfig文件
        容器启动master组件
        将涉及的配置文件存储到configmap
        设置master节点不可调度(打污点)
        启用boostrap自动为kubelet颁发证书
        安装插件:coreDNS、kube-proxy
        提示拷贝连接集群的配置文件
    拷贝连接集群的配置文件admin.conf:
          mkdir -p $HOME/.kube
          sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
          sudo chown $(id -u):$(id -g) $HOME/.kube/config

          
node节点
    向集群添加新节点,执行kubeadm init输出的kubeadm join命令:
     kubeadm join kubeadm join 192.168.50.10:6443 --token iukvkm.x2w42yvm5ctlqo5p --discovery-token-ca-cert-hash sha256:650a0636e03ac97de14a61ccc8dc99ebecfac412c16af74a7912968d0a95b3e2

   #如果当时没记下这个命令,可以用kubeadm命令重新生成:kubeadm token create --print-join-command kubectl get node #查看集群节点状态 kubectl get pods -n kube-system #查看pod状态 -n 指定命名空间 kubectl get ns #查看命名空间 k8s日志位置:/var/log/messages

  清空k8s环境:(如果k8s安装出错,想重新安装。master、node都执行)
    kubeadm reset
    systemctl daemon-reload
    systemctl restart kubelet
    iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

四、安装pod网络插件(CNI) master执行

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

确保能够访问到quay.io这个registry(需要用阿里云yum源才可访问下载)
(如果pod镜像下载失败,可以改成这个镜像地址(在kube-flannel.yml文件中):lizhenliang/flannel:v0.11.0-amd64)

kubectl get pod --all-namespaces    //查看pod是否是running状态
kubectl get nodes     查看节点信息

五、部署UI界面(master执行)

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

默认dashboard只能集群内部访问,修改Service为Nodeport类型,暴露到外部
    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: 30001
      selector:
        k8s-app: kubernetes-dashboard
        
访问地址:https://192.168.50.10:30001
    kubectl get svc -n kubernetes-dashboard     #查看命名空间下pod的对外端口等信息 
获取登录dashboard的token
    kubectl describe secret -n kubernetes-dashboard    //详细查看dashboard的token
    
创建service account并绑定默认cluster-admin管理员集群角色:
    kubectl create serviceaccount dashboard-admin -n kube-system    #创建账号
    kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin     #将账号绑定到系统角色上
    kubectl descibe secrets -n kube-system dashboard-admin    #获取账号产生的token,使用输出的token登录dashboard
  

替换自签证书:解决k8s UI界面只能在火狐浏览器访问的问题
    证书分为:
        1、自签证书 cfssl、openssl
        2、权威机构颁发,例如赛门铁克、沃通
    
    kubeadm部署
        1、删除默认的secret,用自签证书创建新的secret
            kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard
            kubectl create secret generic kubernetes-dashboard-certs --from-file=/etc/kubernetes/pki/apiserver.key --from-file=/etc/kubernetes/pki/apiserver.crt
        2、修改dashboard.yaml文件,在args下面增加证书俩行
            args:
                - --auto-generate-certificates
                - --tls-key-file=apiserver.key
                - --tls-cert-file=apiserver.crt
            
          kubectl apply -f kubernetes-dashboard.yaml        #让yaml文件生效
                
        
测试:创建nginx测试集群
    kubectl create deployment nginx --image=nginx        #创建pod
    kubectl expose deployment nginx --port=80 --type=NodePort    #暴露服务
    
    kubectl get deploy,pod,svc       #查看资源信息
posted @ 2022-04-14 17:12  等风来~~  阅读(878)  评论(0编辑  收藏  举报