使用kubeadm安装k8s集群


使用kubeadm安装k8s集群

本文前提: 完成通过克隆创建k8s节点基础环境

OS基础信息

bash
[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]#

目录

开通端口

根据需求开通相应端口。

bash
# 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为例。

bash
# 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。

bash
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

bash
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 0sed ... 可以将 SELinux 设置为 permissive 模式(将其禁用)。 只有执行这一操作之后,容器才能访问宿主的文件系统,进而能够正常使用 Pod 网络。您必须这么做,直到 kubelet 做出升级支持 SELinux 为止。

  • 一些 RHEL/CentOS 7 的用户曾经遇到过: 由于 iptables 被绕过导致网络请求被错误的路由。您得保证 在您的 sysctl 配置中 net.bridge.bridge-nf-call-iptables 被设为1

    bash
    cat <<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/ 下按照组织分类的各自目录下了。

  1. 导入k8s的镜像。

    bash
    cd /root/k8s_images/k8s.gcr.io && \
    for image in `ls -1`; do
        docker load -i $image
    done
  2. 导入calico的镜像。

    bash
    cd /root/k8s_images/calico && \
    for image in `ls -1`; do
        docker load -i $image
    done
  3. 在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.

返回目录


文章作者: 少年G
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 少年G !
评论
0 comments
Anonymous
Markdown is supported

Be the first person to leave a comment!