k8s-安装-Ubuntu-国内环境

  1. 添加相应的源 由于需要下载Kubeadm,Kubelet和Kubernetes-cni,多以需要添加源。

    1
    2
    3
    cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
    deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
    EOF
  2. 下载Docker & Kubeadm & Kubelet & Kubernetes-cni

    1
    apt-get update && apt-get install -y docker.io kubelet kubernetes-cni=0.7.5-00 kubeadm
  • 添加源之后,使用 apt-get update 命令会出现错误,原因是缺少相应的key,可以通过下面命令添加(E084DAB9 为上面报错的key后8位):
    1
    2
    3
    4
    gpg --keyserver keyserver.ubuntu.com --recv-keys E084DAB9
    gpg --export --armor E084DAB9 | sudo apt-key add -

    apt-get update && apt-get install -y docker.io kubelet kubernetes-cni=0.7.5-00 kubeadm
  1. 调整系统参数

    1
    2
    3
    4
    5
    6
    7
    sudo swapoff -a # 暂时关闭 swapoff 
    sudo systemctl stop ufw.service # 关闭防火墙
    sudo /etc/init.d/apparmor stop # 停止 AppArmor
    sudo modprobe br_netfilter
    sudo echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
    sudo echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
    sudo sysctl -p
  2. 获取镜像列表

    • 由于官方镜像地址被墙,所以我们需要首先获取所需镜像以及它们的版本。然后从国内镜像站获取。
      1
      kubeadm config images list
  • 获取镜像列表后可以通过下面的脚本从阿里云获取:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    images=(  # 下面的镜像应该去除"k8s.gcr.io/"的前缀,版本换成上面获取到的版本
    kube-apiserver:v1.14.2
    kube-controller-manager:v1.14.2
    kube-scheduler:v1.14.2
    kube-proxy:v1.14.2
    pause:3.1
    etcd:3.3.10
    coredns:1.3.1
    )

    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

master

  1. 初始化环境
    1
    kubeadm init --kubernetes-version=v1.14.2 --apiserver-advertise-address=192.168.14.177 --apiserver-cert-extra-sans=122.112.207.8 --pod-network-cidr=10.244.0.0/16
  • 1
    2
    3
    4
    5
    6
    7
    --apiserver-advertise-address=<ip>

    指定 apiserver 的访问 ip, ip 默认为当前虚拟机的默认网卡 ip.

    当 ip 为内网地址时, k8s 集群只能搭建在网段内部,如果有需求通过外网 ip 来操作 apiserver,需要在启动集群时添加可信参数 --apiserver-cert-extra-sans=116.196.81.106 将外网的 ip 添加进去.

    当 ip 为外网地址时,可以实现不同网段的虚拟机组成 k8s 集群.
  1. 配置授权信息
  • 所需的命令在init成功后也会有提示,主要是为了保存相关的配置信息在用户目录下,这样不用每次都输入相关的认证信息。
    1
    2
    3
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 添加网络插件 ( flannel )
  • 上面安装成功后如果通过查询 kube-system 下 Pod 的运行情况,会发现和网络相关的 Pod 都处于 Pending 的状态,这是因为缺少相关的网络插件,而网络插件有很多个,可以选择自己需要的。
    1
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel
  1. 查看是否安装成功
    1
    kubectl get pods -n kube-system
  • 如果出现类似下面的情况就说明安装完成了
    1
    2
    3
    4
    5
    6
    7
    8
    NAME                              READY   STATUS              RESTARTS   AGE
    coredns-86c58d9df4-mmjls 1/1 Running 0 6h26m
    coredns-86c58d9df4-p7brk 1/1 Running 0 6h26m
    etcd-promote 1/1 Running 1 6h26m
    kube-apiserver-promote 1/1 Running 1 6h26m
    kube-controller-manager-promote 1/1 Running 1 6h25m
    kube-proxy-6ml6w 1/1 Running 1 6h26m
    kube-scheduler-promote 1/1 Running 1 6h25m

node 加入集群

  1. 根据 master 节点 init 后提供的 join 命令加入集群

    1
    kubeadm join 192.168.14.177:6443 --token 3pkmi4.okabu6926c6pfett     --discovery-token-ca-cert-hash sha256:138262f072252dd81692cf02ed5cb0d090202a67db38962c6e64b1bb065b6014
  2. 在 master 节点确认

    1
    kubectl get nodes

节点都为 Ready 状态说明集群已经正确启动了。

1
2
3
4
NAME    STATUS   ROLES    AGE     VERSION
ndoe2 Ready master 3h38m v1.14.2
node1 Ready <none> 28s v1.14.2
node3 Ready <none> 3h2m v1.14.2

其他

  • 节点之间的 hostname 不能重复, 修改命令为

    1
    sudo hostnamectl set-hostname {$name}
  • 默认情况下,通过 kubeadm create token 创建的 token ,过期时间是24小时,这就是为什么过了一天无法再次使用之前记录的 kube join 原生脚本的原因,也可以运行 kubeadm token create --ttl 0 生成一个永不过期的 token

  • 查看 token

    1
    $ kubeadm token list
  • 查看 CA证书 sha256

    1
    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
  • 删除节点

    1
    2
    3
    4
    5
    (master)

    kubectl drain ${nodename} --delete-local-data

    kubectl delete node ${nodename}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(node)

kubeadm reset
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1
systemctl start docker
  • 获取 master 的 join token
1
kubeadm token create --print-join-command