美文网首页
docker 和 k8s 环境搭建 (kubeadmin 方式)

docker 和 k8s 环境搭建 (kubeadmin 方式)

作者: oasis_m | 来源:发表于2020-01-25 15:40 被阅读0次

    声明:所有文章只作为学习笔记用,转载非原创
    https://www.jianshu.com/p/5a911f20d93e
    基础概念 请看另外一篇 或者之前的文章
    https://segmentfault.com/a/1190000020113347
    https://blog.csdn.net/finalkof1983/article/details/85568387
    https://www.jianshu.com/p/502544957c88
    https://segmentfault.com/a/1190000020113347

    搭建: 必看
    https://k8s-install.opsnull.com/01.%E7%B3%BB%E7%BB%9F%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F.html
    https://www.cnblogs.com/tianleblog/p/12108391.html

    https://www.kubernetes.org.cn/5077.html
    https://blog.csdn.net/xinzuini/article/details/103505663
    https://blog.csdn.net/weixin_41581795/article/details/103501022
    https://blog.csdn.net/u013355826/article/details/82801482
    看看
    https://blog.csdn.net/liukuan73/article/details/83116271
    https://www.cnblogs.com/imstrive/p/11409008.html
    看看
    https://blog.csdn.net/subfate/article/details/103774072
    看看
    https://blog.csdn.net/fuck487/article/details/101831415
    看看
    https://www.cnblogs.com/xiexun/p/9527979.html

    # [白话 flannel 和 calico 网络原理](https://www.lbbniu.com/6548.html)
    
    [https://www.lbbniu.com/6548.html](https://www.lbbniu.com/6548.html)
    
    
    Kubernetes CNI 插件 网络最强对比:Flannel、Calico、Canal和Weave
    https://blog.csdn.net/RancherLabs/article/details/88885539 
    
    CNI意为容器网络接口,它是一种标准的设计,为了让用户在容器创建或销毁时都能够更容易地配置容器网络。在本文中,我们将集中探索与对比目前最流行的CNI插件:Flannel、Calico、Weave和Canal(技术上是多个插件的组合)。这些插件既可以确保满足Kubernetes的网络要求,又能为Kubernetes集群管理员提供他们所需的某些特定的网络功能。
    插件负责为接口配置和管理IP地址,并且通常提供与IP管理、每个容器的IP分配、以及多主机连接相关的功能。容器运行时会调用网络插件,从而在容器启动时分配IP地址并配置网络,并在删除容器时再次调用它以清理这些资源。
    
    运行时或协调器决定了容器应该加入哪个网络以及它需要调用哪个插件。然后,插件会将接口添加到容器网络命名空间中,作为一个veth对的一侧。接着,它会在主机上进行更改,包括将veth的其他部分连接到网桥。再之后,它会通过调用单独的IPAM(IP地址管理)插件来分配IP地址并设置路由。
    
    在Kubernetes中,kubelet可以在适当的时间调用它找到的插件,来为通过kubelet启动的pod进行自动的网络配置。
    

    flannel
    https://www.jianshu.com/p/e4c7f83a2a0b
    https://www.jianshu.com/p/e4c7f83a2a0b
    https://blog.csdn.net/liumiaocn/article/details/88835527

    官方flannel git [https://github.com/coreos/flannel](https://github.com/coreos/flannel)
    官方CNI(Container Network Interface Specification)  [https://github.com/containernetworking/cni/blob/master/SPEC.md](https://github.com/containernetworking/cni/blob/master/SPEC.md)
    
    

    版本问题

    #点击相应的版本,查看change.log
     https://github.com/kubernetes/kubernetes/releases 
    
     https://stackoverflow.com/questions/53256739/which-kubernetes-version-is-supported-in-docker-version-18-09 
    

    一些初始化工作:

    如果之前安装过 
    yum remove docker  docker-common docker-selinux docker-engine
    
    yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
    yum install -y yum-utils device-mapper-persistent-data lvm2
    
     
    关闭防火墙
    
    关闭SELinux
    
    配置ntp
    
    配置hosts
    
    # /etc/hosts文件如下:每台主机都要配置
    # tail -3 /etc/hosts
    192.168.174.200 master.xx.com master
    192.168.174.201 node1.xx.com node1
    #192.168.174.202 node2.xx.com node2
      
    关闭swap
    注释掉/etc/fstab中swap那行,并重启主机生效
    # /dev/mapper/centos-swap swap                    swap    defaults        0 0
      
    开启透明网桥
    # echo "net.bridge.bridge-nf-call-iptables=1" >> /etc/sysctl.conf
    # echo "net.bridge.bridge-nf-call-ip6tables=1" >> /etc/sysctl.conf
    # systctl -p
    什么是ipv4转发:出于安全考虑,Linux系统默认是禁止数据包转发的。转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。
    kube-proxy的ipvs模式和calico(都涉及路由转发)都需要主机开启ipv4转发。
    另外,不使用k8s,即使只使用docker的时候,以下两种情况也依赖ipv4转发:
    <1>当同一主机上的两个跨bridge(跨bridge相当于跨网段,跨网络需要路由)的容器互访
    <2>从容器内访问外部
    
    
    centos 7 系统从/usr/lib/sysctl.d/*.conf 和 /etc/sysctl.d/*.conf 加载应用系统配置,加载顺序根据*.conf的文件名确定
    
    手动加载所有的配置文件,执行:
    
    # sysctl --system
    
    单独指定配置文件加载,执行:
    
    # sysctl -p filename.conf
    
    也可以直接通过sysctl工具配置值,执行:
    
    # sysctl kernel.sysrq=1   (效果等同:# echo "1" > /proc/sys/kernel/sysrq)
     
    

    配置docker yum仓库

    # wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
      安装过程中主要做了以下几件事:
    
      在/usr/bin/下生成docker可执行文件(docker、dockerd、containerd、runc等)
    
      在/usr/lib/systemd/system下生成docker.service服务配置文件、docker.socket接口属性文件、containerd.service服务配置文件
    
      在/etc/group中添加docker用户组
    
      在/etc/containerd/下创建了config.toml文件
    
      在/etc/docker下创建了key.json文件
    
      在/etc/alternatives/下生成dockerd软链接文件(实际上是/usr/bin/dockerd软链接到/etc/alternatives/dockerd,再      由/etc/alternatives/dockerd链接回/usr/bin/docker-ce)
    

    配置k8s yum仓库

    # cat > /etc/yum.repos.d/kubernetes.repo <<EOF
    [kubernetes]
    name=kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    gpgcheck=1
    enabled=1
    EOF
    
    

    查看

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

    安装 docker-ce 和kubectl

    也可以安装指定的版本
    sudo yum install docker-ce-18.06.1.ce  
    
    yum install docker-ce kubelet kubeadm kubectl
    

    配置加速:
    可选的很多
    https://segmentfault.com/a/1190000020113347

    https://help.aliyun.com/document_detail/60750.html?spm=a2c4g.11186623.6.545.OY7haW

    
    
    
    tee /etc/docker/daemon.json <<-'EOF'
    
    {
    
    "registry-mirrors": ["https://registry.docker-cn.com"]
    
    }
    
    EOF
    

    禁用 swap

    swapoff -a
    echo "vm.swappiness = 0">> /etc/sysctl.conf
    sysctl -p
    

    拉取 k8s 所需的镜像

    脚本: 
    #!/bin/bash
    # 下面的镜像应该去除"k8s.gcr.io/"的前缀,版本换成kubeadm config images list命令获取到的版本
    images=(
        kube-apiserver:v1.17.2
        kube-controller-manager:v1.17.2
        kube-scheduler:v1.17.2
        kube-proxy:v1.17.2
        pause:3.1
        etcd:3.4.3-0
        coredns:1.6.5
    )
    
    for imageName in ${images[@]} ; do
        docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
        docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
        docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
    done
     
    

    初始化 kubeadmin

    初始化kubeadm
    错误处理文档: 
    [https://blog.csdn.net/cn_yaojin/article/details/100542508](https://blog.csdn.net/cn_yaojin/article/details/100542508)
    [https://cloud.tencent.com/developer/article/1461571](https://cloud.tencent.com/developer/article/1461571)
    
    
    我用的:
    kubeadm init \
      --apiserver-advertise-address=192.168.174.200 \
      --image-repository registry.aliyuncs.com/google_containers \
      --kubernetes-version v1.17.2 \
      --service-cidr=10.1.0.0/16\
      --pod-network-cidr=10.244.0.0/16
    
    报错: 制定错了  --kubernetes-version v1.17.2 \  导致多拉取了好多镜像,删除就好
                docker rmi 7d54289267dc  
                docker rmi registry.aliyuncs.com/google_containers/etcd:3.4.3-0   :由于image id 相同,只有加上版本号删除才可以
                 
    报错:  删除相关文件和目录就好       
    [ERROR FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml]: /etc/kubernetes/manifests/kube-apiserver.yaml already exists
            [ERROR FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml]: /etc/kubernetes/manifests/kube-controller-manager.yaml already exists
            [ERROR FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists
            [ERROR FileAvailable--etc-kubernetes-manifests-etcd.yaml]: /etc/kubernetes/manifests/etcd.yaml already exists
            [ERROR DirAvailable--var-lib-etcd]: /var/lib/etcd is not empty
    
    示例:
    kubeadm init \
    --apiserver-advertise-address=master机器的ip \
    --image-repository registry.aliyuncs.com/google_containers \
    --kubernetes-version v1.16.0 \
    --service-cidr=10.1.0.0/16 \
    --pod-network-cidr=10.244.0.0/16
    上面指定的参数都不能缺
    
    –kubernetes-version: 用于指定k8s版本;
    –apiserver-advertise-address:用于指定kube-apiserver监听的ip地址,就是 master本机IP地址。
    –pod-network-cidr:用于指定Pod的网络范围; 10.244.0.0/16
    –service-cidr:用于指定SVC的网络范围;
    –image-repository: 指定阿里云镜像仓库地址
    
    这一步很关键,由于kubeadm 默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过–image-repository指定阿里云镜像仓库地址
    
    注意:初始化时,留意输出的英文提示,可以及时知道初始化失败的原因,如下warning就是说主机名不对,找不到这个主机
     
    初始化成功后提示:
    

    To start using your cluster, you need to run the following as a regular user:

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

    You should now deploy a pod network to the cluster.
    Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
    https://kubernetes.io/docs/concepts/cluster-administration/addons/

    Then you can join any number of worker nodes by running the following on each as root:

    kubeadm join 192.168.174.200:6443 --token f8drwf.46gfbuxuyb22wqei
    --discovery-token-ca-cert-hash sha256:e938ffe0391185de31070da4c670397fa3b558a856586f2c3fd9a24db7a02cd3

    忘记也是可以找到的
    kubeadm token create --print-join-command

    
    
    
    
    
    

    相关文章

      网友评论

          本文标题:docker 和 k8s 环境搭建 (kubeadmin 方式)

          本文链接:https://www.haomeiwen.com/subject/xxyrthtx.html