Kubernetes

kubernetes安装与配置

本文主要是介绍kubernetes安装与配置,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、系统要求

软硬件最低配置推荐配置
cpu和内存Master: 至少2核和4GB内存
Node:至少4核和16GB内存Master: 4核和16GB内存
Node: 应根据需要运行的容器数量进行配置
Docker1.9版本以上1.12版本
etcd2.0版本以上3.0版本

单master集群

单个master节点,然后管理多个node节点
在这里插入图片描述

多master集群

多个master节点,管理多个node节点,同时中间多了一个负载均衡的过程
在这里插入图片描述

二、etcd安装(可跳过,使用kubeadm可不用安装etc)

以Centos7为例子,首先关闭防火墙

# 关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
# 禁用SELinux,目的让容器可以读取主机文件系统
setenforce 0
# 或者修改系统文件/etc/sysconfig/selinux,将SELINUX=enforcing修改成将SELINUX=disable,然后重启Linux

2.1 etcd yum方式安装

yum install etcd –y
 
vi /etc/etcd/etcd.conf 
 
 
ETCD_NAME="default"
 
ETCD_DATA_DIR="/var/lib/etcd/default"
 
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
 
ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379
 
 
systemctl enable etcd
 
systemctl start etcd

2.2 采用etcd二进制安装

etcd github地址:https://github.com/etcd-io/etcd/releases
下载etcd-v3.3.10-linux-amd64.tar.gz 版本
上传到服务器/usr/local/etcd 目录下且解压

# 解压
tar zxvf etcd-v3.3.10-linux-amd64.tar.gz

# 解压后进入目录将etcd、etcdctl二进制文件复制到/usr/bin目录
cp etcd etcdctl /usr/bin/

# 在/etc/systemd/system/目录里创建etcd.service
[Unit] 
Description=etcd.service 
[Service]
Type=notify
TimeoutStartSec=0
Restart=always
WorkingDirectory=/var/lib/etcd
EnvironmentFile=-/etc/etcd/etcd.conf
ExecStart=/usr/bin/etcd 
[Install] 
WantedBy=multi-user.target

#创建配置/etc/etcd/etcd.conf文件
ETCD_NAME=ETCD Server 
ETCD_DATA_DIR="/var/lib/etcd/"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://本机IP:2379"

设置开机启动

systemctl daemon-reload
systemctl enable etcd.service
systemctl start etcd.service

查询是否自启动

systemctl is-enabled etcd.service

关闭开机自启服务

systemctl disable etcd.service

验证是否正确安装

etcdctl cluster-health

查看运行状态

systemctl status etcd.service

在这里插入图片描述

三、使用kubeadm工具快速安装Kubernetes集群

最简单的安装方法是使用yum install kubernetes 命令完成Kubernetes集群的安装,但仍需修改各组件的启动参数,才能完成Kubernetes 集群的配置。整个过程比较复杂,也容易出错,所以先使用基于kubeadm的安装过程。
安装钱准备

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

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

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

# 根据规划设置主机名【master节点上操作】
hostnamectl set-hostname k8smaster
# 根据规划设置主机名【node1节点操作】
hostnamectl set-hostname k8snode1


# 将桥接的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  

# 时间同步
yum install ntpdate -y
ntpdate time.windows.com

3.1 安装kubeadm和相关工具

首先配置yum源,官方yum源的地址为https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64。如果无法访问官方yum源的地址,则也可以使用国内的一个yum源,地址为http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/,yum源的配置文件vi /etc/yum.repos.d/kubernetes.repo的内容如下:

[kubernetes]name=Kubernetes Respositorybaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled=1gpgcheck=0

然后运行yum install命令安装kubeadm和相关工具:

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

运行下面的命令,启动Docker服务(如果已安装Docker,则无须再次启动)和kubelet服务,并设置为开机自动启动:

systemctl enable docker && systemctl start dockersystemctl enable kubelet && systemctl start kubelet

3.2 kubeadm config(master节点执行)

kubeadm已经进入GA阶段,其控制面初始化和加入节点步骤都支持大量的可定制内容,因此kubeadm还提供了配置文件功能用于复杂定制。同时,kubeadm将配置文件以ConfigMap的形式保存到集群之中,便于后续的查询和升级工作。kubeadm config子命令提供了对这一组功能的支持:

  • kubeadm config upload from-file:由配置文件上传到集群中生成ConfigMap。
  • kubeadm config upload from-flags:由配置参数生成ConfigMap。
  • kubeadm config view:查看当前集群中的配置值。
  • kubeadm config print init-defaults:输出kubeadm init默认参数文件的内容。
  • kubeadm config print join-defaults:输出kubeadm join默认参数文件的内容。
  • kubeadm config migrate:在新旧版本之间进行配置转换。
  • kubeadm config images list:列出所需的镜像列表。
  • kubeadm config images pull:拉取镜像到本地。

例如,执行kubeadm config print init-defaults,可以取得默认的初始化参数文件:

kubeadm config print init-defaults > init-defaults.yaml

在这里插入图片描述

对生成的文件进行编辑,可以按需生成合适的配置。例如,若需要定制镜像仓库的地址,以及Pod的地址范围,则可以使用如下配置,保存为init-config.yaml:

apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
imageRepository: registry.aliyuncs.com/google_containers
kubernetesVersion: v1.18.0
networking:
  podSubnet: 10.100.0.0/16

3.3 下载Kubernetes的相关镜像(master节点执行)

为了从国内的镜像托管站点获得镜像加速支持,建议修改Docker的配置文件,增加RegistryMirror参数,将镜像配置写入配置参数中,例如echo ‘{“registry-mirrors”:[“https://registry.docker-cn.com”]}’ > /etc/docker/daemon.json,然后重启Docker服务。使用config images pull子命令下载所需镜像,例如:

kubeadm config images pull --config=init-config.yaml

在镜像下载完成之后,就可以进行安装了。
在这里插入图片描述

报错:

this version of kubeadm only supports deploying clusters with the control plane version >= 1.22.0. Current version: v1.18.0

报错内容可以看出书中提供的版本太老,不被当前kubeadm支持。

1、查看当前配置中需求的镜像

[root@localhost k8s]# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.23.2
k8s.gcr.io/kube-controller-manager:v1.23.2
k8s.gcr.io/kube-scheduler:v1.23.2
k8s.gcr.io/kube-proxy:v1.23.2
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6

2、修改init-config.yaml

apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
imageRepository: registry.aliyuncs.com/google_containers
kubernetesVersion: v1.23.2
networking:
  podSubnet: 10.100.0.0/16

在这里插入图片描述

3.4 运行kubeadm init命令安装Master(master节点执行)

至此,准备工作已就绪,执行kubeadm init命令即可一键安装Kubernetes的Master。接下来使用kubeadm init命令,使用前面创建的配置文件进行集群控制面的初始化:

kubeadm init --config=init-config.yaml

问题:
在这里插入图片描述

出现端口号被占用和/var/lib/etcd is not empty

#查看端口号
netstat -tupln
#停止etcd服务
systemctl stop etcd

#删除文件下的内容
rm -rf /var/lib/etcd

#重启kubeadm
kubeadm reset

在这里插入图片描述

再次kubeadm init --config=init-config.yaml报错。
在这里插入图片描述

cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

mkdir -p /etc/systemd/system/docker.service.d

systemctl daemon-reload
systemctl restart docker

再去kubeadm init。
Kubernetes的Master安装成功,显示如下信息
按照提示执行下面的命令,复制配置文件到普通用户的home目录下:
在这里插入图片描述

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

这样就在Master上安装了Kubernetes,但在集群内还是没有可用的工作Node,并缺乏对容器网络的配置。这里需要注意kubeadm init命令执行完成后的最后几行提示信息,其中包含加入节点的指令(kubeadm join)和所需的Token。

此时可以用kubectl命令验证在2.2.2节中提到的ConfigMap:

kubectl get -n kube-system configmap

在这里插入图片描述

安装calico网络插件

下载并安装calico
如果我们使用kubectl get nodes会发现status状态为NotReady状态,这是因为我们还没有安装网络插件

wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate

更改calico.yaml,通过命令行:/ 搜索Cluster type to identify the deployment type
:/Cluster type to identify the deployment type

# Cluster type to identify the deployment type
  - name: CLUSTER_TYPE
  value: "k8s,bgp"
# 下方熙增新增
  - name: IP_AUTODETECTION_METHOD
    value: "interface=ens32"
    # ens32为本地网卡名字

应用配置:

kubectl apply -f calico.yaml

3.5 node加入集群(node节点执行)

对于新节点的添加,系统准备和Kubernetes yum源的配置过程是一致的,在Node主机上执行下面的安装过程。
1、安装kubeadm和相关工具:

# 根据规划设置主机名【node1节点操作】
hostnamectl set-hostname k8snode1

#安装kubeadm和相关工具:
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

2、运行下面的命令启动Docker服务与kubelet服务,并将其设置为开机自启动:

systemctl enable docker && systemctl start dockersystemctl enable kubelet && systemctl start kubelet

3、执行kubeadm join 命令,将本Node加入集群:

kubeadm join 192.168.152.173:6443 --token ual2oe.gk2r3mbnc5hxwacz \	--discovery-token-ca-cert-hash sha256:e52bfd0a5551604e368b6ed50ce14f9afd4c3d1366277b6a790b4cfc933255c4

apiServerEndpoint的值来自Master服务器的地址,token和tlsBootstrapToken的值就来自于使用kubeadm init安装Master的最后一行提示信息。如果忘记了token信息和证书信息可使用以下命令查询:

[root@iZ2zeb4qsoj3p5ymi6ksehZ k8s]# kubeadm token list
TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
ex5byq.j1cy4zn75ufwytu2   23h         2022-01-22T08:32:10Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token

token 24小时失效可使用如下命令重新创建:

kubeadm token create

错误1:如果不加–discovery-token-ca-cert-hash 可能出现以下错误,说明需要进行ca校验可以使用–discovery-token-unsafe-skip-ca-verification参数忽略校验

discovery.bootstrapToken: Invalid value: "": using token-based discovery without caCertHashes can be unsafe. Set unsafeSkipCAVerification to continue
kubeadm join --token ex5byq.j1cy4zn75ufwytu2 39.107.14.61:6443 --discovery-token-unsafe-skip-ca-verification

错误2:
在这里插入图片描述

执行命令:

echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables

再次加入master节点
在这里插入图片描述

在master查看节点的状态

kubectl get nodes

在这里插入图片描述

3.6 验证Kubernetes集群是否安装完成

执行下面的命令,验证Kubernetes集群的相关Pod是否都正常创建并运行:

kubectl get pods --all-namespaces

如果发现有状态错误的Pod,则可以执行kubectl --namespace=kube-system describe pod <pod_name>来查看错误原因,常见的错误原因是镜像没有下载完成。如果安装失败,则可以执行kubeadm reset命令将主机恢复原状,重新执行kubeadm init命令再次安装(注意在执行 kubeadm reset命令后需要执行rm -rf $HOME/.kube

3.7 测试kubernetes集群

我们都知道K8S是容器化技术,它可以联网去下载镜像,用容器的方式进行启动
在Kubernetes集群中创建一个pod,验证是否正常运行:

# 下载nginx 【会联网拉取nginx镜像】
kubectl create deployment nginx --image=nginx
# 查看状态
kubectl get pod

如果我们出现Running状态的时候,表示已经成功运行了
在这里插入图片描述

下面我们就需要将端口暴露出去,让其它外界能够访问

# 暴露端口kubectl expose deployment nginx --port=80 --type=NodePort# 查看一下对外的端口kubectl get pod,svc

能够看到,我们已经成功暴露了 80端口 到 30608上
在这里插入图片描述

我们到我们的宿主机浏览器上,访问如下地址

http://192.168.152.173:30608/

发现我们的nginx已经成功启动了
在这里插入图片描述

这篇关于kubernetes安装与配置的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!