kubernetes(k8s)安装部署详细文档——kubeadm安装

Kubernetes 系统简介

k8s是Kubernetes的简称,因为K和S之间有8个字母,所以才会被称为k8s。
  Kubernetes(k8s)是Google开源的容器集群管理系统(内部:Borg),它是一个全新的基于容器技术的分布式架构领先方案。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
  Kubernetes是一个完备的分布式系统支撑平台,具有完备的集群管理能力,多扩多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。同时Kubernetes提供完善的管理工具,涵盖了包括开发、部署测试、运维监控在内的各个环节。

  关于k8s更详细的介绍,可以移步至k8s中文文档或者k8s官方网站 ,以便查看更多资料。


一、Kubernetes 部署方式

Kubernetes(k8s)有以下3种主流安装部署方式:
①Minikube安装
②kubeadm方式安装k8s
③二进制方式部署

Minikube是由Kubernetes社区维护的单机版的Kubernetes集群,支持macOS, Linux, and Windows等多种操作系统平台,使用最新的官方stable版本,并支持Kubernetes的大部分功能,从基础的容器编排管理,到高级特性如负载均衡、Ingress,权限控制等。非常适合作为Kubernetes入门,或开发测试环境使用。但不适合使用在生产环境中,所以在此就不详细赘述。

此篇主要介绍kubeadm方式安装k8s,二级制方式部署另外再专门写篇文章介绍。


二、kubeadm安装kubernetes

1.前期准备

  kubernetes版本更新迭代非常快,现在已经更新到v1.20。本篇文章基于kubeadm搭建kubernetes v1.18.8版。

环境准备

机器名称 机器配置 机器系统 IP地址 角色
master1 2C4G CentOS7.6 172.16.55.201 主节点
node1 2C4G CentOS7.6 172.16.55.202 工作节点1
node2 2C4G CentOS7.6 172.16.55.203 工作节点1

说明:
master采用单节点,多master高可用集群搭建后面文章再介绍。
硬件配置要求:2C2G +;
操作系统要求:CentOS7 +
防火墙说明:如果使用的是云厂商的虚拟机,主节点安全组需放行tcp端口6443、2379-2380、10250-12025,工作节点安全组需放行tcp端口:10250、30000-32767

2.正式开始部署安装

2.1 更换yum源

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache

2.2 关闭防火墙和selinux及交换分区

[root@master1 ~]# systemctl stop firewalld
[root@master1 ~]# setenforce 0
[root@master1 ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
[root@master1 ~]# swapoff -a
#永久关闭,修改/etc/fstab,注释掉swap一行

2.3 修改hosts文件

[root@master1 ~]# cat >> /etc/hosts << EOF
172.16.55.201 master1
172.16.55.202 node1
172.16.55.203 node2
EOF

2.4 时间同步

[root@master1 ~]# yum install chrony -y
[root@master1 ~]# systemctl start chronyd
[root@master1 ~]# systemctl enable chronyd
[root@master1 ~]# chronyc sources

2.5 修改内核参数

让iptables能查看桥接流量
[root@master1 ~]# cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
[root@master1 ~]# sysctl --system

2.6 加载ipvs模块

[root@master1 ~]# modprobe -- ip_vs
[root@master1 ~]# modprobe -- ip_vs_rr
[root@master1 ~]# modprobe -- ip_vs_wrr
[root@master1 ~]# modprobe -- ip_vs_sh
[root@master1 ~]# modprobe -- nf_conntrack_ipv4
[root@master1 ~]# lsmod | grep ip_vs
[root@master1 ~]# lsmod | grep nf_conntrack_ipv4
[root@master1 ~]# yum install -y ipvsadm

2.7 安装并配置docker

3.7.1 修改docker的yum源为阿里源
[root@master1 ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
或者
[root@master1 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.7.2 安装docker
[root@master1 ~]# yum list docker-ce --showduplicates | sort -r             #查看所有的docker-ce版本
[root@master1 ~]# yum list docker-ce-cli --showduplicates | sort -r             #查看所有的docker-ce-cli版本
[root@master1 ~]# yum install -y docker-ce-19.03.12-3.el7 docker-ce-cli-19.03.9-3.el7        #安装指定版本(若只指定docker-ce版本,docker-ce-cli则会安装最新版本)
[root@master1 ~]# docker --version
Docker version 19.03.12, build 48a66213fe
[root@master1 ~]# systemctl enable docker
[root@master1 ~]# systemctl start docker
2.7.3 配置docker加速并修改驱动

网上有很多大佬无私地提供了一些dockerhub加速地址,可以选择1个或多个使用。

[root@master1 ~]# cat > /etc/docker/daemon.json << EOF
{
     
    "exec-opts": ["native.cgroupdriver=systemd"],
    "registry-mirrors": [
        "https://1nj0zren.mirror.aliyuncs.com",
        "https://kfwkfulq.mirror.aliyuncs.com"
    ]
}
EOF
[root@master1 ~]# systemctl restart docker
[root@master1 ~]# docker info | grep "Cgroup Driver"
 Cgroup Driver: systemd

  kubernetes官方建议docker驱动采用systemd,当然可以不修改,只是kubeadm init时会有warning([WARNING IsDockerSystemdCheck]: detected “cgroupfs” as the Docker cgroup driver. The recommended driver is “systemd”. Please follow the guide at https://kubernetes.io/docs/setup/cri/)可以忽略,生产环境建议修改,因为更稳定。

2.8 安装kubernents组件

2.8.1 配置kubernentes的yum源为阿里源

因为国内无法访问kubernents的官方yum源,所以需要修改

[root@master1 ~]# cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2.8.2 安装组件

查看kubernetes版本

[root@master1 ~]# yum list kubelet --showduplicates | sort -r
#yum -y install kubelet kubeadm kubectl
#使用此命令默认安装最新版,我们此次安装1.18版本,所以安装时需要指定版本
[root@master1 ~]# yum -y install kubelet-1.18.8 kubeadm-1.18.8 kubectl-1.18.8         #安装指定版本
[root@master1 ~]# kubelet --version
Kubernetes v1.18.8

设置kubelet,增加配置信息
如果不配置kubelet,可能会导致K8S集群无法启动。为实现docker使用的cgroupdriver与kubelet 使用的cgroup的一致性。

vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
[root@master1 ~]# systemctl start kubelet
[root@master1 ~]# systemctl enable kubelet

此时kubelet处于不断重启状态,因为集群还没有初始化,kubelet等待kubeadm初始化完成后运行状态正常。

2.9 初始化集群(Master)

2.9.1 查看初始化需要的镜像
[root@master1 ~]# kubeadm config images list
W0822 15:58:54.182176   25602 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
k8s.gcr.io/kube-apiserver:v1.18.8
k8s.gcr.io/kube-controller-manager:v1.18.8
k8s.gcr.io/kube-scheduler:v1.18.8
k8s.gcr.io/kube-proxy:v1.18.8
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7

如果是第一次安装k8s,手里没有备份好的镜像,可以执行如下操作备份。

查看安装集群需要的镜像
kubeadm config images list

编写执行脚本
mkdir -p /root/data && cd /root/data 
vim images.sh
#!/bin/bash 
# 下面的镜像应该去除"k8s.gcr.io"的前缀,版本换成kubeadm config images list命令获取到的版本
images=(
 kube-apiserver:v1.18.8
 kube-controller-manager:v1.18.8
 kube-scheduler:v1.18.8
 kube-proxy:v1.18.8
 pause:3.2
 etcd:3.4.3-0
 coredns:1.6.7 
 )
 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

给脚本授权并执行脚本
chmod +x images.sh 
执行脚本 
./images.sh 

​保存Master镜像:
docker save -o k8s.1.18.8.tar \
k8s.gcr.io/kube-proxy:v1.18.8 \
k8s.gcr.io/kube-apiserver:v1.18.8 \
k8s.gcr.io/kube-controller-manager:v1.18.8 \
k8s.gcr.io/kube-scheduler:v1.18.8 \
k8s.gcr.io/coredns:1.6.7 \
k8s.gcr.io/etcd:3.4.3-0 \
k8s.gcr.io/pause:3.2
​保存Node镜像:
docker save -o k8s.1.18.8.node.tar \
k8s.gcr.io/kube-proxy:v1.18.8 \
k8s.gcr.io/pause:3.2

导入镜像
master节点需要全部镜
docker load -i k8s.1.18.8.tar
node节点需要kube-proxy:v1.17.5和pause:3.2,2个镜像
scp /root/data/k8s.1.18.8.node.tar root@172.16.55.202:/root
docker load -i k8s.1.18.8.node.tar
2.9.2 kubeadm init介绍
初始化集群需使用kubeadm init命令,可以指定具体参数初始化,也可以指定配置文件初始化。
可选参数:
--apiserver-advertise-address apiserver的监听地址,有多块网卡时需要指定
--apiserver-bind-port apiserver的监听端口,默认是6443
--cert-dir 通讯的ssl证书文件,默认/etc/kubernetes/pki
--control-plane-endpoint 控制台平面的共享终端,可以是负载均衡的ip地址或者dns域名,高可用集群时需要添加
--image-repository 拉取镜像的镜像仓库,默认是k8s.gcr.io
--kubernetes-version 指定kubernetes版本
--pod-network-cidr pod资源的网段,需与pod网络插件的值设置一致
--service-cidr service资源的网段
--service-dns-domain service全域名的后缀,默认是cluster.local
2.9.3 初始化
[root@master1 ~]# kubeadm init --kubernetes-version=v1.18.8  --apiserver-advertise-address 0.0.0.0 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr 172.16.0.0/16 --service-cidr 10.10.0.0/16 --ignore-preflight-errors=Swap
--kubernetes-version 请指定为你需要安装的v1.18.8及以下的版本。

初始化成功后会出现如下信息
kubernetes(k8s)安装部署详细文档——kubeadm安装_第1张图片
末尾为工作节点添加信息:

kubeadm join 172.16.55.201:6443 --token 7ofrkh.laf5f4yku8na043s \
    --discovery-token-ca-cert-hash sha256:43bff6f15c054d6ba49ab37c3d8609fdd043433928f5280af365cbda3e150ba4 

配置kubectl与kube-apiserver交互

[root@master1 ~]# mkdir -p $HOME/.kube
[root@master1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master1 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

至此可以使用kubectl查看集群节点状态了

[root@master1 ~]# kubectl get nodes

kubernetes(k8s)安装部署详细文档——kubeadm安装_第2张图片

2.9.4 开启ipvs

修改kube-proxy的configmap

[root@master1 ~]# kubectl edit cm kube-proxy -n=kube-system
修改 mode: ipvs
[root@localhost ~]# kubectl edit cm kube-proxy -n=kube-system

若执行kubectl报错
T h e c o n n e c t i o n t o t h e s e r v e r l o c a l h o s t : 8080 w a s r e f u s e d − d i d y o u s p e c i f y t h e r i g h t h o s t o r p o r t ? \color{#FF0000}{The connection to the server localhost:8080 was refused - did you specify the right host or port?} Theconnectiontotheserverlocalhost:8080wasrefuseddidyouspecifytherighthostorport?
解决:
方式一:编辑文件设置

vim /etc/profile
export KUBECONFIG=/etc/kubernetes/admin.conf            #在底部增加新的环境变量

方式二:直接追加文件内容

echo "export KUBECONFIG=/etc/kubernetes/admin.conf"  >> /etc/profile
使其生效
source /etc/profile
2.9.5 安装网络组件
[root@master1 ~]# wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml
[root@master1 ~]# kubectl apply -f calico.yaml

此时再来看节点状态,已经正常
kubernetes(k8s)安装部署详细文档——kubeadm安装_第3张图片
查组件状态

[root@master1 ~]# kubectl get cs

kubernetes(k8s)安装部署详细文档——kubeadm安装_第4张图片

2.10 worker节点加入集群(Node)

[root@node1 ~]# kubeadm join 172.16.55.201:6443 --token 7ofrkh.laf5f4yku8na043s \
    --discovery-token-ca-cert-hash sha256:43bff6f15c054d6ba49ab37c3d8609fdd043433928f5280af365cbda3e150ba4 

同样的操作将第二个worker节点加入集群。

再次查看集群状态

[root@master1 ~]# kubectl get nodes
[root@master1 ~]# kubectl get pods -A

kubernetes(k8s)安装部署详细文档——kubeadm安装_第5张图片wide
如果join的token之前没有记住,没关系,在master重新生成一下

[root@master1 ~]# kubeadm token create --print-join-command

可以看到节点和个组件的pod状态均正常,至此集群搭建完毕!

kubectl get pods -n kube-system
集群已经准备完成,测试下kubernetes集群
在Kubernetes集群中创建一个pod,验证是否正常运行:
创建nginx容器
 kubectl create deployment nginx --image=nginx
暴露对外端口
 kubectl expose deployment nginx --port=80 --type=NodePort
查看nginx是否运行成功
 kubectl get pod,svc

kubernetes(k8s)安装部署详细文档——kubeadm安装_第6张图片

在浏览器访问NGINX。三个结点都可访问,即说明集群已经搭建完成。kubernetes(k8s)安装部署详细文档——kubeadm安装_第7张图片
扩容nginx副本wei3个,成功

kubectl scale deployment nginx --replicas=3

kubernetes(k8s)安装部署详细文档——kubeadm安装_第8张图片

kubectl get pods

kubernetes(k8s)安装部署详细文档——kubeadm安装_第9张图片
到此,kubeadm方式安装k8s就完成了。
移步到公众号查看更多内容:
kubernetes(k8s)安装部署详细文档——kubeadm安装_第10张图片

你可能感兴趣的:(k8s,kubernetes,docker,linux)