zoukankan      html  css  js  c++  java
  • centos7.8 安装部署 k8s 集群

    centos7.8 安装部署 k8s 集群

    刚接触 k8s,配置环境折腾了一天,感觉有很多坑,网上很多教程已经不靠谱了,自己记录下安装部署 k8s 的全过程。

    环境说明

    software version
    OS CentOS Linux release 7.8.2003 (Core)
    Docker 18.09.6
    kubelet v1.14.2
    kubeadm v1.14.2
    kubectl v1.14.2
    flannel v0.9.1

    Docker 安装

    1. 安装依赖
    yum install -y yum-utils   device-mapper-persistent-data   lvm2
    
    1. 设置 Docker 源
    yum-config-manager     --add-repo     https://download.docker.com/linux/centos/docker-ce.repo
    
    1. 安装 Docker CE

    docker 安装版本查看

    yum list docker-ce --showduplicates | sort -r
    

    安装 Docker,指定版本

    yum install docker-ce-18.09.6 docker-ce-cli-18.09.6 containerd.io
    
    1. 启动 Docker
    systemctl start docker	# 启动 docker服务
    
    systemctl enable docker # 设置开机启动 docker
    
    1. 命令补全

    安装 bash-completion

    yum -y install bash-completion
    
    source /etc/profile.d/bash_completion.sh
    
    1. 镜像加速

    可以在 https://cr.console.aliyun.com 中获取自己的加速域名

    配置 daemon.json 文件

    mkdir -p /etc/docker
    
    cd /etc/docker && vim daemon.json
    
    # 修改文件
    {
      "registry-mirrors": [
      	"https://xxxxxx.mirror.aliyuncs.com"
      ]
    }
    
    1. 重启服务
    systemctl daemon-reload
    
    system restart docker
    
    1. 验证
    docker --version
    
    docker run hello-world
    

    k8s 安装准备工作

    注意 centos 禁用防火墙和 selinux,并且设置 阿里源

    1. 修改主机名
    hostnamectl set-hostname master
    
    cat /etc/hostname	# 查看
    
    1. 修改 hosts (多节点配置)
    cat >> /etc/hosts << EOF
    xxx.xxx.xxx.xxx    master
    xxx.xxx.xxx.xxx    node01
    xxx.xxx.xxx.xxx    node02
    EOF
    
    1. 禁用 swap
    # 临时禁用
    swapoff -a
    
    # 永久禁用
    sed -i.bak '/swap/s/^/#/' /etc/fstab
    
    1. 内核参数修改(重要,不然出现 bug 找半天原因…… )
    # 临时修改
    sysctl net.bridge.bridge-nf-call-iptables=1
    sysctl net.bridge.bridge-nf-call-ip6tables=1
    
    # 永久修改
    cat <<EOF >  /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    
    sysctl -p /etc/sysctl.d/k8s.conf
    
    1. 修改 Cgroup Driver

    修改 /etc/docker/daemon.json

    {
      "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"],
      "exec-opts": ["native.cgroupdriver=systemd"]
    }
    

    重新加载 docker

    systemctl daemon-reload
    
    systemctl restart docker
    
    1. 设置 kubernetes 源

    新增 k8s 源

    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
    

    更新缓存

    yum clean all
    
    yum -y makecache
    

    Master 节点安装 k8s

    版本查看

    yum list kubelet --showduplicates | sort -r 
    

    安装 kubelet,kubeadm,kubectl

    1. 指定版本安装
    yum install -y kubelet-1.14.2
    
    yum install -y kubeadm-1.14.2
    
    yum install -y kubectl-1.14.2
    
    • kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
    • kubeadm 用于初始化集群,启动集群的命令工具
    • kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
    1. 启动 kubelet 并设置开机启动
    systemctl enable kubelet && systemctl start kubelet
    
    1. Kubelet 命令补全

    https://kubernetes.io/zh/docs/tasks/tools/install-kubectl/

    (我使用的 zsh,bash 和 zsh 有所不同)

    Bash:

    echo "source <(kubectl completion bash)" >> ~/.bash_profile
    source .bash_profile 
    

    Zsh:

    if [ $commands[kubectl] ]; then
      source <(kubectl completion zsh)
    fi
    

    如果是 On-My-Zsh,需要在 plugin 中加入

    plugins=(kubectl)
    

    下载镜像

    Kubernetes几乎所有的安装组件和Docker镜像都放在goolge自己的网站上,直接访问可能会有网络问题,这里的解决办法是从阿里云镜像仓库下载镜像,拉取到本地以后改回默认的镜像tag。

    1. 新建 image.sh 脚本。
    #!/bin/bash
    url=registry.cn-hangzhou.aliyuncs.com/google_containers
    version=v1.14.2
    images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
    for imagename in ${images[@]} ; do
      docker pull $url/$imagename
      docker tag $url/$imagename k8s.gcr.io/$imagename
      docker rmi -f $url/$imagename
    done
    
    1. 下载镜像
    chmod u+x image.sh
    
    ./image.sh
    
    docker images
    

    初始化 Master

    1. 初始化
    kubeadm init
    
    1. 加载环境变量
    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
    
    source .bash_profile 
    

    如果不是在 root 用户下执行,需要执行以下操作:

    mkdir -p $HOME/.kube
    
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    
    chown $(id -u):$(id -g) $HOME/.kube/config
    
    1. 安装 pod 网络

    拉取镜像

    docker pull quay.io/coreos/flannel:v0.9.1-amd64
    
    mkdir -p /etc/cni/net.d/
    
    cat <<EOF> /etc/cni/net.d/10-flannel.conf
    {"name":"cbr0","type":"flannel","delegate": {"isDefaultGateway": true}}
    EOF
    

    设置环境变量

    mkdir /usr/share/oci-umount/oci-umount.d -p
    mkdir /run/flannel/
    cat <<EOF> /run/flannel/subnet.env
    FLANNEL_NETWORK=172.100.0.0/16
    FLANNEL_SUBNET=172.100.1.0/24
    FLANNEL_MTU=1450
    FLANNEL_IPMASQ=true
    EOF
    

    开启网络

    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
    
    1. master 节点配置

    默认情况下集群不会在master上调度pod,如果偏想在master上调度Pod,可以执行如下操作:

    查看 taint

     kubectl describe node master|grep -i taints
    

    删除默认污点

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

    这个涉及 k8s 的 taint 污点和 toleration 容忍机制,可以自己查阅文档。

    Master Pod 配置例子

    1. 查看 master 节点的 taint 配置
    $ kubectl describe node master
    

    查看到 taint 配置为

    ...
    Taints:             node.kubernetes.io/not-ready:NoExecute
                        node.kubernetes.io/not-ready:NoSchedule
                        key=value:PreferNoSchedule
    ...
    
    1. 在 Pod 中配置能够分配 toleration,使其能够分配使用

    添加配置:

    spec:
      tolerations:
      - key: node.kubernetes.io/not-ready
      operator: Exists
      effect: NoSchedule
    
    1. 运行 Pod
    $ kubectl create -f mysql.yaml
    
    $ kubectl describe pod mysql
    ...
    Normal   Scheduled        4m35s                   default-scheduler  Successfully assigned default/mysql-rm2dv to master
    
    ...
    

    启动测试

    启动 nginx 实例并且访问

    1. 命令方式
    kubectl run httpd-app --image=httpd --replicas=3
    
    1. 配置文件方式
    $ cat >> nginx.yml << EOF
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 3
      template:
        metadata:
          labels:
            app: nginx
        spec:
          restartPolicy: Always
          containers:
          - name: nginx
            image: nginx:latest
    EOF
    
    $ kubectl apply -f nginx.yml 
    
    1. 状态查看
    kubectl get nodes
    
    kubectl get svc		# 查看服务所开放的端口
    
    1. 查看 pod 状态
    kubectl get pod --all-namespaces
    
    1. 查看副本数目
    kubectl get deployments
    
    kubectl get pod -o wide
    
    1. 查看集群基本组件状态
    kubectl get cs
    
    1. 访问

    在其他机器上访问即可,通过 nodePort 暴露端口。


    漫长的过程,还有很多报错和问题随后再开个帖子记录。

    参考文章

  • 相关阅读:
    BZOJ 2574: [Poi1999]Store-Keeper
    BZOJ 1024: [SCOI2009]生日快乐
    BZOJ 2541: [Ctsc2000]冰原探险
    hihoCoder 1303 数论六·模线性方程组
    Codeforces 710 D. Two Arithmetic Progressions
    BZOJ 1670: [Usaco2006 Oct]Building the Moat护城河的挖掘
    ZJOI2014 2048
    51Nod 1766 树上的最远点对
    Codeforces 727 F. Polycarp's problems
    BZOJ 3736: [Pa2013]Karty
  • 原文地址:https://www.cnblogs.com/veeupup/p/13543026.html
Copyright © 2011-2022 走看看