基于CentOS7.6搭建K8S-集群搭建篇

针对内网机器搭建K8S集群,先联网机器将依赖之类的进行downloadonly,然后将依赖打包拷贝到不能联网机器
离线环境需要准备CentOS7.6的DVD版的ISO文件

节点内容

1
2
3
4
5
6
7
8
9
10
11
12
13
# 每个节点都有docker+k8s,并且k8s所需镜像都得有
k8s.gcr.io/kube-proxy
k8s.gcr.io/kube-apiserver
k8s.gcr.io/kube-scheduler
k8s.gcr.io/kube-controller-manager
k8s.gcr.io/coredns
k8s.gcr.io/etcd
k8s.gcr.io/pause
# 每个节点都需要网络镜像
calico/node
calico/cni
calico/pod2daemon-flexvol
calico/kube-controllers

节点准备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# CentOS7.6三台
vi /etc/sysconfig/network-scripts/ifcfg-ens33
onboot=yes
service network restart
ip addr

192.168.17.129
192.168.17.130
192.168.17.131

# 配置阿里yum源--联网操作
[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

yum clean all
yum makecache

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

# 关闭Swap
swapoff -a #临时关闭
sed -i '/ swap / s/^/#/' /etc/fstab #永久关闭

# 关闭Selinux
setenforce 0

安装Docker

1
2
3
4
5
6
7
8
9
10
11
mkdir /root/yum
yum install --downloadonly --downloaddir=/root/yum/ yum-utils device-mapper-persistent-data lvm2
yum install yum-utils device-mapper-persistent-data lvm2
# 添加仓库--联网操作
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装
yum install --downloadonly --downloaddir=/root/yum/ docker-ce
yum install docker-ce
# 启动docker服务并开机启动
systemctl start docker & systemctl enable docker
docker version

安装Kubernetes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 配置yum源
vi /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

yum clean all
yum makecache

yum install --downloadonly --downloaddir=/root/yum/ kubelet kubeadm kubectl
yum install kubelet kubeadm kubectl

# 启动kubelet
systemctl enable kubelet

# 配置kubelet的cgroup drive
docker info | grep -i Cgroup
vi /etc/docker/daemon.json #手动创建
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl daemon-reload && systemctl enable docker && systemctl restart docker


# 初始化Master(需要翻墙拉取镜像)
kubeadm init

# kubeadm的配置文件
/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf

# 修改配置文件需要重启kubelet
systemctl daemon-reload
systemctl restart kubelet

# 查看需要用到的镜像<不需要翻墙的做法>
kubeadm config images list
# 拉取镜像
kubeadm config images list |sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#mirrorgooglecontainers#g' |sh -x
# kube-apiserver拉取失败
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.15.3
# coredns需要从其他仓库下载
docker pull coredns/coredns:1.3.1
# 修改tag,将镜像标记为k8s.gcr.io
docker images |grep mirrorgooglecontainers |awk '{print "docker tag ",$1":"$2,$1":"$2}' |sed -e 's#mirrorgooglecontainers#k8s.gcr.io#2' |sh -x
docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.15.3 k8s.gcr.io/kube-apiserver:v1.15.3
# 删除没用的镜像
docker images | grep mirrorgooglecontainers | awk '{print "docker rmi " $1":"$2}' | sh -x
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.15.3
docker rmi coredns/coredns:1.3.1
# 查看已有镜像
docker images
# 初始化指定k8s版本
kubeadm init --kubernetes-version=1.15.3

集群启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 需要创建另一个网卡,VMware直接手动添加一个网络适配器
ip a
cd /etc/sysconfig/network-scripts/
cp ./ifcfg-ens33 ./ifcfg-ens37
vi ifcfg-ens37
# Master(node01)启动
kubeadm init --pod-network-cidr=192.168.0.0/16 --kubernetes-version=v1.15.3 --apiserver-advertise-address=192.168.17.132

# 执行完上述命令后,会有提示,根据提示执行命令,同时记住join命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 创建网络需要引入docker镜像,如果需要在内网部署,则提前save好镜像文件,版本与calico.yaml内版本一致
calico/node
calico/cni
calico/kube-controllers
calico/pod2daemon-flexvol

# 创建网络(calico.yaml可以下载下来,链接可能更新,可以在官网自行找到)
kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml

# 加入集群
kubeadm join 192.168.17.129:6443 --token jt6t8v.p7btvogl1l0wivga \
--discovery-token-ca-cert-hash sha256:a2ee7cf619eb081474fcf295a4da7491afd75b3d913763888f5f01226ca80e90


# 重启/删除集群(删除.kube很重要)
kubeadm reset
rm -rf $HOME/.kube
# 其余节点删除
rm -rf /etc/cni/*
rm -rf /etc/kubernetes/*
rm -rf /var/lib/etcd/*
rm -rf /var/lib/kubelet/*
rm -rf /var/lib/cni/*
rm -rf /var/lib/calico/*
kubeadm init --pod-network-cidr=192.168.0.0/16 --kubernetes-version=v1.15.3 --apiserver-advertise-address=192.168.17.129

设置集群

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 将Master作为工作节点
kubectl taint nodes --all node-role.kubernetes.io/master-

# 将其他节点加入集群(其他节点执行join命令即可)
kubeadm join 192.168.17.129:6443 --token jt6t8v.p7btvogl1l0wivga \
--discovery-token-ca-cert-hash sha256:a2ee7cf619eb081474fcf295a4da7491afd75b3d913763888f5f01226ca80e90

# 查看节点
kubectl get nodes

# 查看pod状态
kubectl get pod -n kube-system

# 查看所有pod状态
kubectl get pods -n kube-system

kubeadm init参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
--apiserver-advertise-address string
API Server将要广播的监听地址。如指定为 `0.0.0.0` 将使用缺省的网卡地址。

--apiserver-bind-port int32 缺省值: 6443
API Server绑定的端口

--apiserver-cert-extra-sans stringSlice
可选的额外提供的证书主题别名(SANs)用于指定API Server的服务器证书。可以是IP地址也可以是DNS名称。

--cert-dir string 缺省值: "/etc/kubernetes/pki"
证书的存储路径。

--config string
kubeadm配置文件的路径。警告:配置文件的功能是实验性的。

--cri-socket string 缺省值: "/var/run/dockershim.sock"
指明要连接的CRI socket文件

--dry-run
不会应用任何改变;只会输出将要执行的操作。

--feature-gates string
键值对的集合,用来控制各种功能的开关。可选项有:
Auditing=true|false (当前为ALPHA状态 - 缺省值=false)
CoreDNS=true|false (缺省值=true)
DynamicKubeletConfig=true|false (当前为BETA状态 - 缺省值=false)

-h, --help
获取init命令的帮助信息

--ignore-preflight-errors stringSlice
忽视检查项错误列表,列表中的每一个检查项如发生错误将被展示输出为警告,而非错误。 例如: 'IsPrivilegedUser,Swap'. 如填写为 'all' 则将忽视所有的检查项错误。

--kubernetes-version string 缺省值: "stable-1"
为control plane选择一个特定的Kubernetes版本。

--node-name string
指定节点的名称。

--pod-network-cidr string
指明pod网络可以使用的IP地址段。 如果设置了这个参数,control plane将会为每一个节点自动分配CIDRs。

--service-cidr string 缺省值: "10.96.0.0/12"
为service的虚拟IP地址另外指定IP地址段

--service-dns-domain string 缺省值: "cluster.local"
为services另外指定域名, 例如: "myorg.internal".

--skip-token-print
不打印出由 `kubeadm init` 命令生成的默认令牌。

--token string
这个令牌用于建立主从节点间的双向受信链接。格式为 [a-z0-9]{6}\.[a-z0-9]{16} - 示例: abcdef.0123456789abcdef

--token-ttl duration 缺省值: 24h0m0s
令牌被自动删除前的可用时长 (示例: 1s, 2m, 3h). 如果设置为 '0', 令牌将永不过期。

镜像源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 微软google gcr镜像源
#以gcr镜像为例,以下镜像无法直接拉取
docker pull gcr.io/google-containers/kube-apiserver:v1.15.2
#改为以下方式即可成功拉取:
docker pull gcr.azk8s.cn/google-containers/kube-apiserver:v1.15.2

# 微软coreos quay镜像源
#以coreos镜像为例,以下镜像无法直接拉取
docker pull quay.io/coreos/kube-state-metrics:v1.7.2
#改为以下方式即可成功拉取:
docker pull quay.azk8s.cn/coreos/kube-state-metrics:v1.7.2

# 微软dockerhub镜像源
#以下方式拉取镜像较慢
docker pull centos
#改为以下方式使用微软镜像源:
docker pull dockerhub.azk8s.cn/library/centos
docker pull dockerhub.azk8s.cn/willdockerhub/centos

# dockerhub google镜像源
#以gcr镜像为例,以下镜像无法直接拉取
docker pull gcr.io/google-containers/kube-apiserver:v1.15.2
#改为以下方式即可成功拉取:
docker pull mirrorgooglecontainers/google-containers/kube-apiserver:v1.15.2

# 阿里云google镜像源
#以gcr镜像为例,以下镜像无法直接拉取
docker pull gcr.io/google-containers/kube-apiserver:v1.15.2
#改为以下方式即可成功拉取:
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.15.2

离线包制作

1
2
3
4
5
6
7
8
9
10
11
12
# 将上述操作产生的/root/yum文件打包,在内网机器进行createrepo
tar -zcvf yum.tgz /root/yum
# 内网机器操作
tar -zxvf yum.tgz
createrepo /root/yum
yum clean all
yum makecache
# 进行安装操作就行

# kubeadm所需要的镜像直接进行save,load
docker save -o kube-apiserver.tar kube-apiserver
docker load -i kube-apiserver.tar