2. kubeadm初始化kubernetes集群
[TOC]
本文基于马哥的docker和k8s视频总结, 在此致谢马哥.
- 集群每个组件的运行状态会保存在
etcd
中
- k8s部署示例:
集群规划:
- 节点网络: 192.168.200.0/24 (根据自己的网络规划)
- Pod网络 (默认): 10.244.0.0/16
- Service网络: 10.96.0.0/12
kubeadm部署步骤
安装前请确保
firewalld
和iptables
没有启动, 因为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镜像
# 以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)
网友评论