实验准备环境

分别将3台虚拟机命名,设置好对应IP,并将其写入域名解析/etc/hosts中,关闭防火墙,iptables,禁用selinux。还有要做到,时间必须一致。全部禁用swap

  1. CPU: 双核
  2. Mem: 2G
  3. 3台linux服务器或者dockerhost
  4. 时间必须同步
  5. 准备docker环境
主机名IP地址服务
master10.10.1.22centos7
node0110.10.1.61centos7
node0210.10.1.74centos7

在这里插入图片描述

  • 安装 kubeadm、kubelet 和 kubectl
    你需要在每台机器上安装以下的软件包:

    kubeadm:用来初始化集群的指令。
    kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
    kubectl:用来与集群通信的命令行工具。

  • 验证时间是否一致

yum install ntpdate
ntpdate -u ntp.api.bz
  • 检查docker 情况
// 查询docker安装过的包:
yum list installed | grep docker
//删除安装包:
yum remove docker-ce.x86_64 ddocker-ce-cli.x86_64 -y
//删除镜像/容器等
rm -rf /var/lib/docker
  • 给三台机器命名

    hostnamectl set-hostname master
    hostnamectl set-hostname node01
    hostnamectl set-hostname node02
    
  • 关闭防火墙和禁用selinux

    [root@master ~]# systemctl stop firewalld
    [root@master ~]# systemctl disable firewalld
    [root@master ~]# vim /etc/selinux/config
    

    在这里插入图片描述

  • 禁用swap分区(三台)

    [root@master ~]# swapoff -a
    //临时禁用swap
    [root@master ~]# free -h
    [root@master ~]# vim /etc/fstab 
    

在这里插入图片描述

  • 添加域名解析(三台)

    echo 10.10.1.22  master >> /etc/hosts
    echo 10.10.1.61	 node01 >> /etc/hosts
    echo 10.10.1.74	 node02 >> /etc/hosts
    
  • 做免密登陆(三台)

    //生成密钥
     ssh-keygen -t rsa
    
  • 复制密钥到其他主机

     ssh-copy-id node01
     ssh-copy-id node02
    
  • 把域名解析复制到其他主机

     scp /etc/hosts node01:/etc
     scp /etc/hosts node02:/etc
    
  • 打开路由转发和iptables桥接功能(三台)

    vim /etc/sysctl.d/k8s.conf
    //写入k8s.conf开启iptables桥接功能
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    
    echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf 
     sysctl -p /etc/sysctl.d/k8s.conf 
     
     //如果出现以下错误执行modprobe br_netfilter
     sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: 没有那个文件或目录
     sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: 没有那个文件或目录
     
     //执行从系统的文件加载时候执行
     sysctl -p 
    
  • 把路由转发和iptables桥接复制到其他主机

    scp /etc/sysctl.d/k8s.conf  node01:/etc/sysctl.d/
    scp /etc/sysctl.d/k8s.conf  node02:/etc/sysctl.d/
    scp /etc/sysctl.conf  node02:/etc/
    scp /etc/sysctl.conf  node01:/etc/
    
  • 在node1和node2上执行以下命令让路由转发生效(三台)

    sysctl -p /etc/sysctl.d/k8s.conf 
    sysctl -p 
    

master节点安装部署k8s

  • 使用过程中查看日志
journalctl -xefu kubelet
  • 指定yum安装kubernetes的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
//检查下仓库是否可用
yum repolist 
  • 创建本地缓存(三台)
yum makecache fast

各节点安装所需安装包

  • master下载
yum list installed | grep docker
yum -y remove docker-ce-cli.x86_64
yum list docker-ce --showduplicates|sort -r
yum install docker-ce-18.03.0.ce 
systemctl enable docker && sudo systemctl start docker

docker 使用 yum install docker-ce-18.03.0.ce

yum -y install kubeadm-1.15.0-0 kubelet-1.15.0-0 kubectl-1.15.0-0
  • node01和node02下载
yum -y install kubeadm-1.15.0-0 kubelet-1.15.0-0
  • 三台主机把 kubelet加入开机自启
systemctl enable kubelet
  • 从docker镜像站下载镜像
    docker pull mirrorgooglecontainers/kube-apiserver:v1.14.1
    docker pull mirrorgooglecontainers/kube-controller-manager:v1.14.1
    docker pull mirrorgooglecontainers/kube-scheduler:v1.14.1
    docker pull mirrorgooglecontainers/kube-proxy:v1.14.1
    docker pull mirrorgooglecontainers/pause:3.1
    docker pull mirrorgooglecontainers/etcd:3.3.10
    docker pull coredns/coredns:1.3.1
    
  • 也可以自己上传导入镜像
    忽略

初始化Kubernetes集群

  • 指定的两个网络初始化
    kubeadm init --kubernetes-version=v1.15.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
    由于上述设置版本和网络的命令不行,使用下边的命令看到下边的字样
kubeadm init --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Swap

在这里插入图片描述
可以看到让继续执行

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

//最好记住以下的内容,避免kubeadm reset时候需要执行rm -rf /var/lib/etcd有风险
kubeadm join 10.10.1.22:6443 --token adezmf.s3ldbn3d6nkldqfc \ --discovery-token-ca-cert-hash sha256:5c3126f012ca7f759510bbf4e752227c94aa650f7179cf0bea61508fa2caed89 \ --ignore-preflight-errors=Swap

kubectl get nodes #查看群集节点信息
在这里插入图片描述

  • 添加网络组件
    组件flannel可以通过https://github.com/coreos/flannel中获取
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    //也可以下载下来直接使用
    kubectl apply -f  xxx.yml
    
    kubectl get pods --all-namespaces
    

如果kube-flannel-ds-dq2kq出现CrashLoopBackOff
在这里插入图片描述
检查mirrorgooglecontainers/etcd:3.3.10的镜像是否拉取完成
在这里插入图片描述

node01和node02加入群集

这时使用的命令是初始化群集之后生成的令牌(只有24小时的时效) 就是上边让保存的那段代码

kubeadm join 10.10.1.22:6443 --token peoadn.mqtwhfdt2ga82ajc \
    --discovery-token-ca-cert-hash sha256:c155cdd834da8747b14a94426e999473116c488bf9c81ba46d02169a1b3243f7 \
    --ignore-preflight-errors=Swap

出现以下的日志说明加入成功
kubectl get nodes
在这里插入图片描述
检查集群的是否都正常了,出现下边的字样。
在这里插入图片描述

kubeadm生成的token重新获取

当你的token忘了或者过期,解决办法如下:

  1. 先获取token
    #重新生成token
    kubeadm token create
    #列出token
    kubeadm token list | awk -F" " '{print $1}' |tail -n 1
    
  2. 获取CA公钥的哈希值
    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^ .* //'
    
  3. 从节点加入集群
    kubeadm join 192.168.40.8:6443 --token token填这里 --discovery-token-ca-cert-hash sha256:哈希值填这里
    

k8s部署中遇到的问题

  • 在join节点时候出现以下问题日志查看 journalctl -xeu kubelet
    failed to run Kubelet: Running with swap on is not supported, please disable swap! or set --fail-swap-on flag to false.
    配置忽略swap报错

     vim /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS="--fail-swap-on=false"
    
  • error execution phase preflight: couldn’t validate the identity of the API Server: abort connecting to API servers after timeout of 5m0s

    #生成token
    kubeadm token generate 
    #根据token输出添加命令
    kubeadm token create pmiad9.1g4qrc4yvkqxggse --print-join-command --ttl=0
    
  • error execution phase kubelet-start: error uploading crisocket: timed out waiting for the condition

    swapoff -a 
    kubeadm reset
    systemctl daemon-reload
    systemctl restart kubelet
    iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
    

docker使用中遇到的问题

  • 出现Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?重启下docker
    systemctl start docker
  • 出现 response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 114.114.144.114:53: server misbehaving
    配置/etc/docker/daemon.json,这里最好检查下自己的json中是否有空格和别的。这样会导致docker启动不了
    {
      "registry-mirrors":[
            "https://registry.docker-cn.com",
            "http://hub-mirror.c.163.com"
            ],
      "insecure-registries":[
            "registry-1.docker.io"
            ]
    }
    
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐