说明:

现在Kubernetes最新版本在v1.23.5,但是为啥我写个v1.18.1呢?其实版本不同也就镜像不同,因此我们以V1.18.1为例,前期的一些配置是通用的,到后面也就pull镜像是不一样。

安装K8S

  1. 实验环境:CentOS7.5,K8S—1.18.1,Docker—

    主机IP配置
    Master192.168.9.104VCPUS ,4G
    Node1192.168.9.1302VCPUS,2G
    Node2192.168.9.1312VCPUS,2G

修改主机名,并解析(all-node)

[root@localhost ~]# hostnamectl set-hostname master
[root@localhost ~]# bash
[root@master ~]# hostname
master

关闭防火墙,Iptables,Selinux(all-node)

#防火墙
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld

#Iptables
[root@master ~]# iptables -F
[root@master ~]# iptables -X
[root@master ~]# iptables -Z
[root@master ~]# /usr/sbin/iptables-save 

#Selinux
[root@master ~]# setenforce 0
[root@master ~]# vi /etc/selinux/config 
SELINUX=disabled      #修改
#或:
sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config 

配置时钟服务(master)

以master为上游服务器,node以master的时间校准

[root@master ~]# yum install -y chrony
[root@master ~]# vi /etc/chrony.conf 
server master iburst       #注释前面的4行server...,并且添加这一行
allow 192.168.9.0/24       #去掉注释,并修改
local stratum 10           #去掉注释
[root@master ~]# systemctl restart chronyd
[root@master ~]# systemctl enable chronyd

#测试
[root@master ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* master                       10   6    77   155  -2230ns[-6309ns] +/-   13us

配置时钟服务(node)

[root@node1 ~]# yum install -y chrony
[root@node1 ~]# vi /etc/chrony.conf 
server master iburst       #注释前面的4行server...,并且添加这一行
[root@node1 ~]# systemctl restart chronyd
[root@node1 ~]# systemctl enable chronyd

#测试
[root@node1 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* master                       11   6    17    58   +120us[+2105us] +/- 4143us

关闭交换分区(all-node)

[root@master ~]# swapoff -a
[root@master ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           3.7G        150M        3.1G         19M        448M        3.3G
Swap:            0B          0B          0B        #swap变为0即可

#在修改fstab文件,使其永久关闭
[root@master ~]# vi /etc/fstab 
#/dev/mapper/centos-swap swap                    swap    defaults        0 0    #注释这一行

安装Docker(all-node)

#在阿里云镜像中找到Docker,安装yum源并下载Docker
[root@master ~]# yum install -y docker-ce

#添加加速器:找到阿里云的镜像服务,
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://pve03e8m.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker

Docker拉取镜像代理配置(可选)

[root@master ~]# vi /usr/lib/systemd/system/docker.service 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fEgrtfrq-1649404463363)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1641039561603.png)]

在[Service]中添加这三行内容

  • EXecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT ###改变iptables规则
  • Environment=“HTTPS_PROXY=http://www.ik8s.io:10070” ###我们知道Master和Node节点有的组件需要以pod的方式其启动,而启动pod就需要镜像,这行的目的就是添加一个网址去在这个网址中pull镜像
  • Environment=“NO_PROXY=127.0.0.1/8,192.168.9.0/24” ###规定除了pull镜像去使用http://www.ik8s.io:10070这个地址,其他的网路都是有本机回环ip或本机内网ip

修改由Docker引起的Iptables规则

注:可以向上面那样直接写在配置文件中

也可以直接命令行:

[root@master ~]# iptables -P FORWARD ACCEPT

重启服务:

systemctl daemon-reload
systemctl restart docker

设置路由转发(内核参数)(all-node)

可以先来查查:

[root@master ~]# sysctl -a |grep bridge
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1          #可以看到默认是开着的
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-filter-pppoe-tagged = 0
net.bridge.bridge-nf-filter-vlan-tagged = 0
net.bridge.bridge-nf-pass-vlan-input-dev = 0
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.docker0.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.ens34.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"

在写一遍:

[root@master ~]# vi /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1

[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf 
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1

安装Kubelet,kubeadm,kubectl(all-node)

#找到阿里云镜像,点击kubernetes,配置kubernetes的Yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

#开始安装:
[root@master yum.repos.d]# yum install -y kubelet-1.18.1 kubeadm-1.18.1 kubectl-1.18.1 --nogpgcheck
sudo systemctl enable --now kubelet

####################第二种方法###############################
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
   http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF


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

sudo systemctl enable --now kubelet

来看看各个工具包中的文件(可选)

[root@master ~]# rpm -ql kubelet
/etc/kubernetes/manifests
/etc/sysconfig/kubelet
/usr/bin/kubelet
/usr/lib/systemd/system/kubelet.service

[root@master ~]# rpm -ql kubeadm
/usr/bin/kubeadm
/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf


[root@master ~]# vi /etc/sysconfig/kubelet                                               #在此文件下定义的参数会在/usr/lib/systemd/system/kubelet.service文件中生效,如果上面的swap不关闭,但是也想要不报错,可以在这里定义参数:
KUBELET_EXTRA_ARGS="--fail-swap-on=false"

kubeadm命令就是用来部署kubernetes集群的

查看kubeadm的命令:

	• Completion---shell命令的补全功能
	• config,查看一些配置信息,很复杂
	• Init,启动一个kubernetes主节点,初始化kubernetes集群
	• join,启动一个kubernetes工作节点并加入到集群中
	• reset,还原之前使用kubeadm init或kubeadm join对节点做的操作
	• token,使用kubeadm join来管理令牌,token的保质期为24小时
	• upgrade,用来更新kubernetes集群到新版本
	• version,查看kubernetes的版本信息

来看看初始化一个集群式的配置信息:

kubeadm config print init-defaults

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BN0NveSu-1649404463365)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1641046559129.png)]

其实,kubernetes是不管pod间怎样通信的,也就说pod间通信不是kubernetes取定义的,它就不管这事,那pod间通信是如何实现的呢?

其实kubernetes提供一个CNI,叫:容器网络接口,CNI是第三方插件。

那这就相当于pod间的网络是第三方插件提供的。

能够为pod网络提供的方案很多,有两个:

1.flanner他的网络段是:10.244.0.0/16,当然这个网段可以自定义,如果自定义需要在两处定义:1.在部署kubernetes时指定网段,部署flanner时指定网段

2.calico,它默认的网段:192.168.0.0/16

初始化kubernetes集群

在初始化kubernetes集群有两种方式:
第一种方法:
1. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bBeKn7w2-1649404463366)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1641046783181.png)]

  1. 另一个是直接写一个上图的init初始化文件,再用kubeadm init config指定这个文件

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vCU8gZqw-1649404463368)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1641046803642.png)]

重要的部分—获取镜像

如果不做任何措施,初始化kubernetes集群所需要的镜像是在国外的,在拉取时会失败,我们可以pull阿里云的镜像,然后再tag。

初始化命令:

kubeadm init --kubernetes-version=1.18.1 --pod-network-cidr=10.244.0.0/16

可以添加参数:

kubeadm init --kubernetes-version=1.18.1 --apiserver-advertise-address=$IP --image-repository $IP/library --pod-network-cidr=10.244.0.0/16
#kubeadm 使用 eth0 的默认网络接口(通常是内网IP)做为 Master 节点的 advertise address ,如果我们想使用不同的网络接口,可以使用 --apiserver-advertise-address=<ip-address> 参数来设置
#--image-repository 指定后端镜像仓库

如何知道初始化kubernetes集群所需要那些镜像呢?我们可以先初始化,然后等报错就会显示出来了

在master节点需要下面7个的基础镜像:

k8s.gcr.io/kube-apiserver:v1.18.1
k8s.gcr.io/kube-controller-manager:v1.18.1
k8s.gcr.io/kube-scheduler:v1.18.1
k8s.gcr.io/kube-proxy:v1.18.1
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7

然后进入阿里云,拉取相关镜像:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iZEyoT4h-1649404463370)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1641048018392.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ovFvfTE9-1649404463370)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1641048088166.png)]

[root@master ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.1
[root@master ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.1
[root@master ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.1
[root@master ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.1
[root@master ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
[root@master ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
[root@master ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7

然后在tag镜像

[root@master ~]# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.1 k8s.gcr.io/kube-apiserver:v1.18.1
[root@master ~]# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.1 k8s.gcr.io/kube-controller-manager:v1.18.1
[root@master ~]# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.1 k8s.gcr.io/kube-scheduler:v1.18.1
[root@master ~]# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.1 k8s.gcr.io/kube-proxy:v1.18.1
[root@master ~]# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
[root@master ~]# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
[root@master ~]# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7

查看镜像

[root@master ~]# docker images
REPOSITORY                                                                    TAG       IMAGE ID       CREATED         SIZE
k8s.gcr.io/kube-proxy                                                         v1.18.1   4e68534e24f6   21 months ago   117MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy                v1.18.1   4e68534e24f6   21 months ago   117MB
k8s.gcr.io/kube-apiserver                                                     v1.18.1   a595af0107f9   21 months ago   173MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver            v1.18.1   a595af0107f9   21 months ago   173MB
k8s.gcr.io/kube-controller-manager                                            v1.18.1   d1ccdd18e6ed   21 months ago   162MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager   v1.18.1   d1ccdd18e6ed   21 months ago   162MB
k8s.gcr.io/kube-scheduler                                                     v1.18.1   6c9320041a7b   21 months ago   95.3MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler            v1.18.1   6c9320041a7b   21 months ago   95.3MB
k8s.gcr.io/pause                                                              3.2       80d28bedfe5d   22 months ago   683kB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause                     3.2       80d28bedfe5d   22 months ago   683kB
k8s.gcr.io/coredns                                                            1.6.7     67da37a9a360   23 months ago   43.8MB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns                   1.6.7     67da37a9a360   23 months ago   43.8MB
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd                      3.4.3-0   303ce5db0e90   2 years ago     288MB
k8s.gcr.io/etcd                                                               3.4.3-0   303ce5db0e90   2 years ago     288MB

在此初始化kubernetes集群

[root@master ~]# kubeadm init --kubernetes-version=1.18.1 --pod-network-cidr=10.244.0.0/16

然后根据提示的结果进行操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-clsggH48-1649404463371)(C:\Users\郑波\AppData\Roaming\Typora\typora-user-images\1641049183161.png)]

[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

查看集群状态:

[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES    AGE     VERSION
master   NotReady   master   2m55s   v1.18.1

发现时NotReady的状态,说明还缺个插件—网络插件

先pull镜像

[root@master ~]# docker pull quay.io/coreos/flannel:v0.14.0

apply文件,文件内容在此文件夹下

[root@master ~]# kubectl apply -f aa.yaml 
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

查看pod中的容器运行情况

[root@master ~]# kubectl get pod -n kube-system
NAME                             READY   STATUS    RESTARTS   AGE
coredns-66bff467f8-mc7m2         1/1     Running   0          18m
coredns-66bff467f8-p84qc         1/1     Running   0          18m
etcd-master                      1/1     Running   0          18m
kube-apiserver-master            1/1     Running   0          18m
kube-controller-manager-master   1/1     Running   0          18m
kube-flannel-ds-6wxtz            1/1     Running   0          119s
kube-proxy-hdlwl                 1/1     Running   0          18m
kube-scheduler-master            1/1     Running   0          18m

这时再来查看kubernetes集群的状态

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   19m   v1.18.1

添加节点

前提条件:在node节点需要以下镜像:

quay.io/coreos/flannel:v0.14.0
k8s.gcr.io/kube-proxy:v1.18.1
k8s.gcr.io/pause:3.2

打包镜像,并scp传入到node节点:

[root@master ~]# docker save --output flannel.tar quay.io/coreos/flannel:v0.14.0 
[root@master ~]# docker save --output proxy.tar k8s.gcr.io/kube-proxy:v1.18.1
[root@master ~]# docker save --output pause.tar k8s.gcr.io/pause:3.2
[root@master ~]# scp flannel.tar proxy.tar pause.tar root@node1:/root/

解压镜像

[root@node1 ~]# docker load -i flannel.tar
[root@node1 ~]# docker load -i proxy.tar
[root@node1 ~]# docker load -i pause.tar 

如果前面假如集群节点的token和 ca证书sha256编码hash的值已经看不到了,可以这样找回

  • 查看Token

    [root@master ~]# kubeadm token list
    TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
    2wrsgm.omdwtzrk7cdrisrm   23h         2022-01-02T22:57:29+08:00   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token
    
  • 获取ca证书sha256编码hash值

    [root@master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
    669cc1f43025e3b29bee44f882804bc0315e3d9a73d87ab407fcd62637bd9e2c
    

直接生成新Token

kubeadm token create --print-join-command

然后执行命令:

#如果环境不干净,可以先清除环境
kubeadm reset
rm -rf /root/.kube/*
#然后:
kubeadm join 192.168.9.10:6443 --token 2wrsgm.omdwtzrk7cdrisrm  --discovery-token-ca-cert-hash sha256:669cc1f43025e3b29bee44f882804bc0315e3d9a73d87ab407fcd62637bd9e2c

查看node节点状态

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE    VERSION
master   Ready    master   33m    v1.18.1
node1    Ready    <none>   2m8s   v1.18.1
node2    Ready    <none>   19s    v1.18.1

使用calico网络插件

网址:https://projectcalico.docs.tigera.io/

直接apply

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
#一直等,然后查看calico相关的镜像,并将其打包scp到node1,node2节点中去
docker save --output calico-kube-controllers.tar calico/kube-controllers:v3.21.4
docker save --output calico-cni.tar calico/cni:v3.21.4
docker save --output calico-pod2daemon-flexvol.tar calico/pod2daemon-flexvol:v3.21.4
docker save --output calico-node.tar calico/node:v3.21.4
docker save --output pause.tar k8s.gcr.io/pause:3.2
docker save --output flannel.tar quay.io/coreos/flannel:v0.14.0 
#scp
scp calico-* pause.tar proxy.tar root@node1:/root/
#docker load
docker load -i calico-cni.tar 
docker load -i calico-kube-controllers.tar 
docker load -i calico-node.tar 
docker load -i calico-pod2daemon-flexvol.tar 
docker laod -i pause.tar 
docker load -i proxy.tar 
#然后在加入集群
#来个测试文件
[root@master ~]# docker pull nginx
#ff.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: default
  labels:
    app: nginx
    version: v1
spec:
  containers:
  - name: nginx-con
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: svc1
  namespace: default
spec:
  selector:
    app: nginx
    version: v1
  ports:
  - port: 82
    targetPort: 80	

卸载k8s集群

kubeadm reset
rm -rf /root/.kube/*
Logo

开源、云原生的融合云平台

更多推荐