zoukankan      html  css  js  c++  java
  • k8s的kubeadm安装

    前言:

      上一篇转载的博客介绍了二进制包的安装方法,和容器的安装方式相比,二进制包还是相对繁琐的,很多的配置文件需要手动修改,本篇博客将介绍如何使用docker来进行k8s的安装。

    192.168.181.131 master
    192.168.181.130 node1

    1.安装前的准备

    !!!以下操作需要在所有master和node上执行

    关闭selinux,关闭防火墙

    将两台主机的主机名修改为如上所示,并在/etc/hosts上建立相应的映射

    关闭swap
    swap的作用类似Windows系统下的“虚拟内存”

    查看

    free -g

    # 永久关闭swap分区

    swapoff -a && sed -i 's/.*swap.*/#&/' /etc/fstab

    master与node创建密钥并互信
    参考:https://blog.csdn.net/allensandy/article/details/101473338

    验证(互相能够免密登录)


    安装同步时钟

     yum install -y ntpdate
    
    ntpdate time.windows.com

    内核调整,将桥接的IPv4流量传递到iptables的链

    配置系统内核参数使流过网桥的流量也进入iptables/netfilter框架中

    echo > /etc/sysctl.d/k8s.conf << EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    
    sysctl -p

    安装kubernetes和docker的yum源:

    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
     
    name=Kubernetes repo
     
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
     
    gpgcheck=0
     
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
     
    enabled=1
    
    EOF
    
    
    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -P /etc/yum.repos.d/

    安装docker  kubelet  kubeadm  kubelectl

    yum install docker kubelet kubeadm kubectl -y

    配置国内镜像并开启docker

    tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://dlbpv56y.mirror.aliyuncs.com"]
    }
    EOF
    
    systemctl enable docker && systemctl start docker

    开启kublet

    systemctl enable kubelet && systemctl start kubelet

    以下操作分节点功能实施!!!

    2.在master节点上启动集群。

    kubeadm init 
    --apiserver-advertise-address=192.168.181.131 
    --image-repository registry.aliyuncs.com/google_containers 
    --kubernetes-version v1.17.4 
    --service-cidr=10.96.0.0/12 
    --pod-network-cidr=10.244.0.0/16
     
    请耐心等1-2分钟直到结束
    IP当然是master的IP,需要注意的是版本号,我借鉴的文章是1.16.0,我执行的时候报错提示为1.17.4,修改了之后启动成功。

    参数介绍:

    –apiserver-bind-port int32 Default: 6443 可以通过这个参数指定API-server的工作端口,默认是6443。
    –config string 可以通过这个命令传入kubeadm的配置文件,需要注意的是,这个参数是实验性质的,不推荐使用。
    –dry-run 带了这个参数后,运行命令将会把kubeadm做的事情输出到标准输出,但是不会实际部署任何东西。强烈推荐!
    -h, --help 输出帮助文档。
    –node-name string 指定当前节点的名称。
    –pod-network-cidr string 通过这个值来设定pod网络的IP地址网段;设置了这个值以后,控制平面会自动给每个节点设置CIDRs(无类别域间路由,Classless Inter-Domain Routing)。
    –service-cidr string Default: “10.96.0.0/12” 设置service的CIDRs,默认为 10.96.0.0/12。
    –service-dns-domain string Default: “cluster.local” 设置域名称后缀,默认为cluster.local。
    其他参数。

    kubeadm-init的工作流

    在运行了 kubeadm init 命令以后,都进行了那些操作呢?这里主要就是跟着官方文档来翻译一遍了:

    首先会运行一系列预检代码来检查系统的状态;大部分的检查只会抛出一个警告,也有一部分会抛出异常错误从而导致工作流推出(比如没有关闭swap或者没有安装docker)。官方给出一个参数–ignore-preflight-errors=, 我估计八成大家用不到,除非真的明白自己在做啥。。。
    生成一个用来认证k8s组件间调用的自签名的CA(Certificate Authority,证书授权);这个证书也可以通过–cert-dir(默认是/etc/kubernetets/pki)的方式传入,那么这一步就会跳过。
    把kubelet、controller-manager和scheduler等组件的配置文件写到/etc/kubernets/目录,这几个组件会使用这些配置文件来连接API-server的服务;除了上面几个配置文件,还会生成一个管理相关的admin.conf文件。
    如果参数中包含–feature-gates=DynamicKubeletConfig,会把kubelet的初始化配置文件写入/var/lib/kubelet/config/init/kubelet这个文件;官方给出一坨文字解释,这里先不探究了,因为我没有用到。。。
    接下来就是创建一些 静态pod 的配置文件了,包括API-server、controller-manager和scheduler。假如没有提供外部etcd,还会另外生成一个etcd的静态Pod配置文件。这些静态pod会被写入/etc/kubernetes/manifests,kubelet进程会监控这个目录,从而创建相关的pod。
    假如第五步比较顺利,这个时候k8s的控制面进程(api-server、controller-manager、scheduler)就全都起来了。
    如果传入了参数–feature-gates=DynamicKubeletConfig,又会对kubelet进行一坨操作,因为没有用到,所以这里不做详细探究。
    给当前的节点(Master节点)打label和taints,从而防止其他的负载在这个节点运行。
    生成token,其他节点如果想加入当前节点(Master)所在的k8s集群,会用到这个token。
    进行一些允许节点以 Bootstrap Tokens) 和 TLS bootstrapping 方式加入集群的必要的操作:
    设置RBAC规则,同时创建一个用于节点加入集群的ConfigMap(包含了加入集群需要的所有信息)。
    让Bootstrap Tokens可以访问CSR签名的API。
    给新的CSR请求配置自动认证机制。
    通过API-server安装DNS服务器(1.11版本后默认为CoreDNS,早期版本默认为kube-dns)和kube-proxy插件。这里需要注意的是,DNS服务器只有在安装了CNI(flannel或calico)之后才会真正部署,否则会处于挂起(pending)状态。
    到这里基本上就告一段落了

    3. node节点的加入:使用上面生成好的token直接在node节点上执行就号好了:

    这个token24小时后会失效,如果后面有其他节点要加入的话,处理方法:
    
    kubeadm token create
    [root@master ~]# kubeadm token create
    0w3a92.ijgba9ia0e3scicg
     
     
     
    [root@master ~]# kubeadm token list
    TOKEN                     TTL       EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
    0w3a92.ijgba9ia0e3scicg   23h       2019-09-08T22:02:40+08:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
    t0ehj8.k4ef3gq0icr3etl0   22h       2019-09-08T20:58:34+08:00   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token
     
     
    [root@k8s-master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
    ce07a7f5b259961884c55e3ff8784b1eda6f8b5931e6fa2ab0b30b6a4234c09a
     
    然后加入集群
    kubeadm join 192.168.10.11:6443 --token yhns57.4s3y2yll21ew8mta 
        --discovery-token-ca-cert-hash sha256:ce07a7f5b259961884c55e3ff8784b1eda6f8b5931e6fa2ab0b30b6a4234c09a
    

    4.安装网络插件:

    在master上执行:

    kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '
    ')"

    这样的话,master与node都会在ready状态了。

    [root@master ~]#  kubectl exec -n kube-system weave-net-h2x7w -c weave -- /home/weave/weave --local status
     
            Version: 2.5.2 (up to date; next check at 2019/10/09 14:32:36)
     
            Service: router
           Protocol: weave 1..2
               Name: 5a:8f:40:d9:92:59(node2)
         Encryption: disabled
      PeerDiscovery: enabled
            Targets: 3
        Connections: 3 (2 established, 1 failed)
              Peers: 3 (with 6 established connections)
     TrustedSubnets: none
     
            Service: ipam
             Status: ready
              Range: 10.32.0.0/12
      DefaultSubnet: 10.32.0.0/12

    5.测试集群,测试代码来自另一篇博文,应用者需要做修改:

    [root@master ~]# kubectl create deployment nginx --image=nginx
    deployment.apps/nginx created
     
    [root@master ~]#  kubectl expose deployment nginx --port=80 --type=NodePort
    service/nginx exposedservice/nginx exposed
     
    [root@master ~]#  kubectl get pods,svc
    NAME                         READY   STATUS    RESTARTS   AGE
    pod/nginx-86c57db685-gbs8f   1/1     Running   0          2m28s
     
    NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        147m
    service/nginx        NodePort    10.99.194.238   <none>        80:30560/TCP   26s

    补充一点:

    k8s集群的离线环境初始化命令:

    sudo kubeadm init --kubernetes-version=v1.13.3 --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=10.21.244.3 --image-repository=my.registry:5000/google_containers
  • 相关阅读:
    随笔——关于读论文
    enumerate
    torch.max
    C# WPF侧边栏导航菜单(Dropdown Menu)
    C# WPF过渡效果实现(C# WPF Material Design UI: Transitions)
    用C# WPF简单实现仪表控件
    自定义滚动条(Custom ScrollBar)
    从头实现一个WPF条形图
    漂亮的无序列表样式
    C# WPF实用的注册窗体
  • 原文地址:https://www.cnblogs.com/xiaoyuxixi/p/12533442.html
Copyright © 2011-2022 走看看