使用kubeadm安装k8s集群
本文前提: 完成通过克隆创建k8s节点基础环境。
OS基础信息
[root@k8s-master-01 helm]# uname -a
Linux k8s-master-01.local 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@k8s-master-01 helm]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
[root@k8s-master-01 helm]#
目录
开通端口
根据需求开通相应端口。
# firewall-cmd
firewall-cmd --zone=public --list-all
# 16443 for apiserver VIP
firewall-cmd --zone=public --add-port=16443/tcp --permanent
# master ports
firewall-cmd --zone=public --add-port=6443/tcp --permanent
firewall-cmd --zone=public --add-port=4001/tcp --permanent
firewall-cmd --zone=public --add-port=2379-2380/tcp --permanent
firewall-cmd --zone=public --add-port=10250/tcp --permanent
firewall-cmd --zone=public --add-port=10251/tcp --permanent
firewall-cmd --zone=public --add-port=10252/tcp --permanent
firewall-cmd --zone=public --add-port=30000-32767/tcp --permanent
firewall-cmd --reload
# worker node ports
firewall-cmd --zone=public --add-port=10250/tcp --permanent
firewall-cmd --zone=public --add-port=30000-32767/tcp --permanent
firewall-cmd --reload
# Calico networking (BGP)
firewall-cmd --zone=public --add-port=179/tcp --permanent
# Calico networking with Typha enabled
firewall-cmd --zone=public --add-port=5473/tcp --permanent
# flannel networking (VXLAN)
firewall-cmd --zone=public --add-port=4789/udp --permanent
firewall-cmd --reload
安装CRI
CRI以Docker为例。
# Install Docker CE
## Set up the repository
### Install required packages.
yum install yum-utils device-mapper-persistent-data lvm2
### Add Docker repository.
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
## Install Docker CE.
# yum update && yum install docker-ce-18.06.2.ce
cd /root/docker_rpms/docker-ce-18.06.2.ce && \
yum localinstall container-selinux-2.99-1.el7_6.noarch.rpm \
docker-ce-18.06.2.ce-3.el7.x86_64.rpm
## Create /etc/docker directory.
mkdir /etc/docker
# Setup daemon.
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "20m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# Restart Docker
systemctl daemon-reload
systemctl restart docker
配置Docker代理
在Docker被墙的情况下可以通过配置Docker代理来爬楼梯。
此处使用的楼梯服务为shadowsocks。
mkdir /etc/systemd/system/docker.service.d
cat > /etc/systemd/system/docker.service.d/http-proxy.conf << EOF
[Service]
Environment="HTTP_PROXY=http://192.168.79.1:1080/"
Environment="HTTPS_PROXY=http://192.168.79.1:1080/"
Environment="NO_PROXY=localhost,127.0.0.1,192.168.*,172.16.*,172.17.*,10.*"
EOF
systemctl daemon-reload
systemctl restart docker
systemctl show docker --property Environment
安装kubeadm、kubelet和kubectl
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF
# Set SELinux in permissive mode (effectively disabling it)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
cd /root/k8s_rpms/kubernetes-v1.14.0 && \
yum localinstall -y \
conntrack-tools-1.4.4-4.el7.x86_64.rpm \
cri-tools-1.12.0-0.x86_64.rpm \
kubeadm-1.14.0-0.x86_64.rpm \
kubectl-1.14.0-0.x86_64.rpm \
kubelet-1.14.0-0.x86_64.rpm \
kubernetes-cni-0.7.5-0.x86_64.rpm \
libnetfilter_cthelper-1.0.0-9.el7.x86_64.rpm \
libnetfilter_cttimeout-1.0.0-6.el7.x86_64.rpm \
libnetfilter_queue-1.0.2-2.el7_2.x86_64.rpm \
socat-1.7.3.2-2.el7.x86_64.rpm
systemctl enable --now kubelet
请注意:
通过命令
setenforce 0
和sed ...
可以将SELinux
设置为permissive
模式(将其禁用)。 只有执行这一操作之后,容器才能访问宿主的文件系统,进而能够正常使用 Pod 网络。您必须这么做,直到kubelet
做出升级支持SELinux
为止。一些 RHEL/CentOS 7 的用户曾经遇到过: 由于
iptables
被绕过导致网络请求被错误的路由。您得保证 在您的sysctl
配置中net.bridge.bridge-nf-call-iptables
被设为1。bashcat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system
保证在执行这一步之前
br_netfilter
已经被加载。可以通过lsmod | grep br_netfilter
确认是否已加载。并且可以通过modprobe br_netfilter
命令加载。
初始化一个master节点
初始化一个master节点的详细步骤可以参阅官网以及我整理的另一篇的文章。
# 请先阅读上面链接,对执行kubeadm的OS基础条件和将要使用的网络组件的要求有所了解。
# on the first master
kubeadm init --kubernetes-version=v1.14.0 --apiserver-advertise-address=<ip-address> --pod-network-cidr=172.16.0.0/16
加入一个worker节点
k8s 用到的镜像可以事先使用 Docker 或者 kubeadm config images pull
下载好。如果需要设置梯子,可以参考配置Docker代理。
这里,为了不重复下载一遍镜像,我把镜像从 master-01 上导出到这个 worker node
上的 /root/k8s_images/
下按照组织分类的各自目录下了。
导入k8s的镜像。
bashcd /root/k8s_images/k8s.gcr.io && \ for image in `ls -1`; do docker load -i $image done
导入calico的镜像。
bashcd /root/k8s_images/calico && \ for image in `ls -1`; do docker load -i $image done
在master上查看加入节点时使用的token。
kubeadm token list
如果没有有效的token,则创建:
kubeadm token create --print-join-command
然后在 worker node 上运行上述命令的结果。
注意:
- 在执行上述添加 worker 节点命令之前,务必确认已经满足pod网络插件的前提条件,详细参考。
- 此处网络插件以 Calico 为例。
添加kubeadm、kubectl命令行自动完成
kubeadm 命令行自动完成。
# Load the kubeadm completion code for bash into the current shell source <(kubeadm completion bash) # Write bash completion code to a file and source it from .bash_profile kubeadm completion bash > ~/.kube/kubeadm_completion.bash.inc printf "\n# Kubeadm shell completion\nsource '$HOME/.kube/kubeadm_completion.bash.inc'\n" >> $HOME/.bash_profile source $HOME/.bash_profile
kubectl 命令行自动完成。
source <(kubectl completion bash) # setup autocomplete in bash into the current shell, bash-completion package should be installed first. echo "source <(kubectl completion bash)" >> ~/.bashrc # add autocomplete permanently to your bash shell.