美文网首页
2. kubeadm初始化kubernetes集群

2. kubeadm初始化kubernetes集群

作者: epiiplus1equal0 | 来源:发表于2019-09-25 23:35 被阅读0次

2. kubeadm初始化kubernetes集群

[TOC]

本文基于马哥的docker和k8s视频总结, 在此致谢马哥.

  • 集群每个组件的运行状态会保存在etcd
k8s基础构件.png
  • k8s部署示例:
k8s部署示例.png

集群规划:

  • 节点网络: 192.168.200.0/24 (根据自己的网络规划)
  • Pod网络 (默认): 10.244.0.0/16
  • Service网络: 10.96.0.0/12

kubeadm部署步骤

安装前请确保firewalldiptables没有启动, 因为k8s在部署过程中会大量操作防火墙规则 !

1. master, nodes: 安装kubelet, kubeadm, docker

  • (1.1) 配置yum仓库 (包括docker和k8s的仓库)

    • docker的yum源:

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/

  • k8s的yum源必须联网并手动配置, 因为官方只支持下载时在线动态生成:
vi /etc/yum.repos.d/kubernetes.repo
      
[k8s]
name=k8s 
enabled=1
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/  
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
      
# 如果有gpgkey报错的话:
wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
rpm --import rpm-package-key.gpg
# 或者直接将上面的gpgkey改为https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  • (1.2) 安装对应包:
yum install docker-ce kubelet kubeadm kubectl
# kubectl: api server的命令行客户端
  • (1.3) 配置docker并启动
vi /usr/lib/systemd/system/docker.service
    
# 启动前在[Service]配置段内添加两个环境变量:
Environment="HTTPS_PROXY=http://www.ik8s.io:10080"
Environment="NO_PROXY=127.0.0.0/8,172.20.0.0/16" 
  # 访问https服务时, 通过此代理访问并加载镜像文件, 加载完之后需要关闭此项
  # 然后可通过国内的docker加速站点进行加速
  # NO_PROXY: 访问本机网络时不需要代理
  # 使用环境变量的前提是国外的代理服务可以使用, 如果不行的话这两项不用配置
    # 换成去阿里云自建镜像仓库, 构建后使用docker image pull拉取镜像
    
systemctl daemon-reload
systemctl enable docker
systemctl start docker
docker info # 查看配置的代理是否生效
# docker随后会修改iptables规则, 因此需要开启nf-call内生的桥接功能
# 确保两值为1
cat /proc/sys/net/bridge/bridge-nf-call-iptables
cat /proc/sys/net/bridge/bridge-nf-call-ip6tables
  • (1.4) 启动kubelet
# 添加配置
vi /etc/sysconfig/kubelet 
KUBELET_EXTRA_ARGS="--fail-swap-on=false" 
    # 如果swap-on, 在启动过程中显示报错
KUBE_PROXY_MODE=ipvs # 开启ipvs功能
    # 还需要使kubectl所在主机启动时自动加载以下内核模块:
    # ip_vs, ip_vs_rr, ip_vs_wrr, ip_vs_sh, nf_conntrack_ipv4
    # nf_conntrack_ipv4: 支持做连接状态追踪

# 暂时只能设置开机自启, 各种初始化还未完成, 故启动时会有报错
systemctl enable kubelet

2. master: kubeadm init

  • (2.1) kubeadm初始化
# 一些初始化参数的说明
kubeadm init --help
    --apiserver-advertise-address string # apiserver的监听地址
                                                                             # 默认本机的0.0.0.0
    --apiserver-bind-port int32 # 监听的端口, 默认6443
    --cert-dir string # 加载证书的相关目录 
                                        # default "/etc/kubernetes/pki"
    --config string # Path to a kubeadm configuration file
    --ignore-preflight-errors strings # 忽略预检查时的一些错误
                                                                # 初始化时如果有Swap报错, 可使用此项
    --kubernetes-version string # 使用的k8s版本
  --node-name string # Specify the node name.
  --pod-network-cidr string # pod所使用的网络
                                                    # flannel默认使用10.244.0.0/16
  --service-cidr string  # service所使用的网络
                                             # default "10.96.0.0/12"
kubeadm init --kubernetes-version=v1.15.3 \ # 此版本号根据实际修改, 可以不设置
                         --pod-network-cidr=10.244.0.0/16 \ 
                         --service-cidr=10.96.0.0/12 \ 
                         --ignore-preflight-errors=Swap 
                           # 此项配置要结合/etc/sysconfig/kubelet文件中的
                           # 参数"--fail-swap-on=false"使用

# 初始化完成后系统返回一串命令, 需要手动执行, 这些命令用于一些k8s默认配置:
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 其他节点如果要加入k8s集群, 需要执行以下命令:
kubeadm join 192.168.200.200:6443 --token wu6sew.fj0r8wflx87ld7y0 \
  --discovery-token-ca-cert-hash sha256:f50f140cfbdce75431813a513007eb463fe62374f25cea4248fde6f2e3844222 --ignore-preflight-errors=Swap 
# 注: 由于国内网络防火墙问题导致无法正常拉取, 初始化的时候会有报错:
[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.15.3: output:al tcp 172.96.236.117:10080: connect: connection refused ...
# 可以参考下面三个网站提供的方法自行在阿里云创建k8s的镜像仓库, 构建好之后拉取使用
# 拉取结束记得重打tag!

Kubernetes国内镜像、下载安装包和拉取gcr.io镜像

通过阿里云容器镜像服务下载gcr.io镜像

国内借助阿里云快速获取gcr.io上的镜像

# 以kube-apiserver为例进行说明:
# 1. 登录阿里云镜像仓库账号
docker login --username=惟我独不尊 registry.cn-hangzhou.aliyuncs.com
# 2. 拉取部署k8s时所需要使用的镜像
docker pull registry.cn-hangzhou.aliyuncs.com/tianjunchang/kube-apiserver:v1.15.3
# 3. 重打标签
docker image tag registry.cn-hangzhou.aliyuncs.com/tianjunchang/kube-apiserver:v1.15.3 k8s.gcr.io/kube-apiserver:v1.15.3
# 4. 重新初始化
kubeadm init --kubernetes-version=v1.15.3 \ 
                     --pod-network-cidr=10.244.0.0/16 \ 
                     --service-cidr=10.96.0.0/12 \ 
                     --ignore-preflight-errors=Swap
  
# 5. 启动kubelet
systemctl start kubelet
# 这里备注一下v1.15.3版本的k8s需要使用的镜像:
k8s.gcr.io/kube-apiserver:v1.15.3
k8s.gcr.io/kube-controller-manager:v1.15.3
k8s.gcr.io/kube-scheduler:v1.15.3
k8s.gcr.io/kube-proxy:v1.15.3
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1
  • (2.2) 部署网络插件flannel:
# For Kubernetes v1.7+
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 注: 如有此报错 unable to recognize "https://raw.githubusercontent.com/coreos/flannel/master/Docum:8080: connect: connection refused
# 是因为没有配置config文件, 即init完成后系统返回的3个命令没有被执行

docker image ls # 需要查看flannel镜像已下载完成
kubectl get ns # 查看系统上的名称空间
kubectl get pods -n kube-system 
    # 查看名称空间为kube-system内的所有pods, 
    # 不指明名称空间是使用的是名为default的名称空间
    # 查看到flannel运行时才说明flannel部署成功
    # 镜像拉取错误时, 删除并下载正确的镜像, 重启docker和kubelet服务即可

3. nodes: kubeadm join

  • (3.1) 将其他节点加入k8s集群
# 1. 添加yum源
vi /etc/yum.repos.d/kubernetes.repo

[k8s]
name=k8s 
enabled=1
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ 
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
             https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    
# 2. 从节点也要安装docker-ce kubelet kubeadm (kubectl可以不安装)
yum install docker-ce kubelet kubeadm kubectl

systemctl enable docker kubelet
systemctl start docker # kubelet启动会有报错, 等加入主节点之后再start

# 3. 确保两值为1
cat /proc/sys/net/bridge/bridge-nf-call-iptables
cat /proc/sys/net/bridge/bridge-nf-call-ip6tables

# 4. 添加配置
vi /etc/sysconfig/kubelet 
KUBELET_EXTRA_ARGS="--fail-swap-on=false"

# 5. 千万注意: 从节点也需要k8s的一些基础镜像文件(虽然没有主节点的多),
# 因此也需要拉取镜像并重打标签!

# 6. 执行主节点初始化时返回的加入集群的命令:
kubeadm join 192.168.200.200:6443 --token wu6sew.fj0r8wflx87ld7y0 \
    --discovery-token-ca-cert-hash sha256:f50f140cfbdce75431813a513007eb463fe62374f25cea4248fde6f2e3844222 --ignore-preflight-errors=Swap 

# 7. 启动kubelet
systemctl start kubelet

# 8. join完成后可在主节点上用此命令查看从节点是否成功加入k8s集群
kubectl get nodes 
NAME    STATUS   ROLES    AGE   VERSION
node1   Ready    master   58m   v1.15.3
node2   Ready    <none>   14m   v1.15.3 
    # node2节点上显示Ready时才说明从节点真正加入成功

kubectl命令自动补全

yum -y install bash-completion
locate bash_completion | grep "bash_complation$"
# 定位到bash_comlation文件的位置后重新加载, 并把下面两行添加到~/.bashrc内
source /usr/share/bash-completion/bash_completion
source < (kubectl completion bash)

相关文章

网友评论

      本文标题:2. kubeadm初始化kubernetes集群

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