K8s 集群部署

K8s 集群部署


文章目录

  • K8s 集群部署
  • 前言
  • 一、部署k8s的两种方式:
  • 二、环境准备
  • 三、初始化准备配置
  • 四、安装 Docker、kubeadm、kubelet【所有节点】
  • 五、部署k8s-master【master执行】
  • 六、部署容器网络 (master执行)
  • 七 部署测试
  • 总结


前言

学习了黑马K8s,首先跟着视频部署K8s,写下笔记

转至 原文链接
整合黑马老师笔记


一、部署k8s的两种方式:

目前生产部署Kubernetes集群主要有两种方式:

一 kubeadm

  • Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。

二 进制包

  • 从github下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。

本文采用kubeadm的方式搭建集群。

二、环境准备

在开始之前,部署Kubernetes 集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统CentOS7.x-86_x64
  • 硬件配置:2GB 或更多RAM,2 个CPU 或更多CPU,硬盘30GB 或更多
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap 分区

k8s-master:192.168.100.10
k8s-node1:192.168.100.11
k8s-node2:192.168.100.12

三、初始化准备配置

检查操作系统的版本

# 此方式下安装kubernetes集群要求Centos版本要在7.5或之上
[root@master ~]# cat /etc/redhat-release
Centos Linux 7.5.1804 (Core)

安装环境准备:下面的操作需要在所有的节点上执行。

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

关闭selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题

sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
setenforce 0  # 临时

禁用iptable和firewalld服务

kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则

# 1 关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld
# 2 关闭iptables服务
systemctl stop iptables
systemctl disable iptables

关闭swap
swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明

swapoff -a  # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久

添加hosts

cat >> /etc/hosts << EOF
192.168.100.10 k8s-master
192.168.100.11 k8s-node1
192.168.100.12 k8s-node2
EOF

将桥接的IPv4流量传递到iptables的链

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system  # 生效

修改dns解析 否则可能无法拉取docker镜像

vi /etc/resolv.conf

#改为 :
nameserver 8.8.8.8
nameserver 114.114.114.114

时间同步
kubernetes要求集群中的节点时间必须精确一直,这里使用chronyd服务从网络同步时间
企业中建议配置内部的会见同步服务器

老师方式

# 启动chronyd服务
[root@master ~]# systemctl start chronyd
[root@master ~]# systemctl enable chronyd
[root@master ~]# date

使用老师方式无法正常同步,使用如下方式

yum install -y ntpdate
ntpdate cn.pool.ntp.org

虚拟机不管关机还是挂起,每次重新操作都需要更新时间进行同步。

四、安装 Docker、kubeadm、kubelet【所有节点】

安装docker:

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl enable docker && systemctl start docker

配置镜像下载加速器:

vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl restart docker
docker info     #查看docker信息,进行确认

添加阿里云软件源:

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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

安装kubeadm、kubelet、kubectl:

 yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
systemctl enable kubelet

五、部署k8s-master【master执行】

kubeadm init \
  --apiserver-advertise-address=192.168.100.10 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.23.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --ignore-preflight-errors=all
  • apiserver-advertise-address 集群通告地址
  • image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
  • kubernetes-version K8s版本,与上面安装的一致
  • service-cidr 集群内部虚拟网络,Pod统一访问入口
  • pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致

初始化之后,会输出一个join命令,先复制出来,node节点加入master会使用。

K8s 集群部署_第1张图片
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:

 kubeadm token create --print-join-command

六、部署容器网络 (master执行)

Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。

下载YAML:

https://docs.projectcalico.org/manifests/calico.yaml

下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样。

修改完后文件后,进行部署:

kubectl apply -f calico.yaml
kubectl get pods -n kube-system    #执行结束要等上一会才全部running

七 部署测试

部署Nginx:

创建一个nginx服务

kubectl create deployment nginx  --image=nginx:1.14-alpine

暴露端口

kubectl expose deploy nginx  --port=80 --target-port=80  --type=NodePort

K8s 集群部署_第2张图片
查看服务

kubectl get pod,svc

K8s 集群部署_第3张图片

完成 !

失败排查 :

K8s 集群部署_第4张图片

kubectl describe pod xxxxx

服务器重启后报错 :

W1208 17:40:31.554144   12505 loader.go:221] Config not found: /root/admin.conf
The connection to the server localhost:8080 was refused - did you specify the right host or port?

Master节点出现这个报错
首先需要检查Master安装完Kubernetes后是否执行了下面命令。需要注意到是:如果整个过程都是在普通用户下使用sudo安装,则仍然需要在普通用户下执行了下面命令;如果整个过程都在root用户下安装,则还在root用户下执行了下面命令。

mkdir -p $HOME/.kube
#root用户下执行不需要加sudo
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

如果执行了,就到用户目录下检查是否有.kube文件夹,文件夹中是否有config文件,如果都有还是报错,就需要执行下面命令把它加入到环境变量中:

export KUBECONFIG=$HOME/.kube/config

Node节点出现这个报错:

kubectl命令需要使用kubernetes-admin来运行,所以需要将主节点中的/etc/kubernetes/admin.conf文件拷贝到从节点用户目录下,然后配置环境变量:

#在Master节点运行下面命令将admin.conf文件拷贝到从节点
sudo scp /etc/kubernetes/admin.conf [email protected]:~
#在Node节点运行下面命令配置环境变量
export KUBECONFIG=$HOME/admin.conf
#使生效
source /etc/profile

重启后任然报错 :

[root@slave1 ~]# kubectl get pod,svc
The connection to the server localhost:8080 was refused - did you specify the right host or port?
[root@slave1 ~]# mkdir -p $HOME/.kube
[root@slave1 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@slave1 ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@slave1 ~]# source ~/.bash_profile
[root@slave1 ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@slave1 ~]# kubectl get pod

总结

你可能感兴趣的:(K8s,kubernetes,docker,容器)