K8S--kubeadm部署

1\先去安装docker 

关闭防火墙:
$ systemctl stop firewalld
$ systemctl disable firewalld

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

关闭swap:
$ swapoff -a # 临时
$ vim /etc/fstab # 永久

设置主机名:
$ hostnamectl set-hostname <hostname>

在master添加hosts:

 192.168.1.19  k8s-master

 192.168.1.20 k8s-node1

 192.168.1.21 k8s-node2

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

 

systemctl  start docker && systemctl  enable  docker

这里安装doker 版本需要注意,docker可能有版本不兼容,目前官方测试时18.06版本比较好。

$ 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-18.06.1.ce-3.el7
$ systemctl enable docker && systemctl start docker 

 配置阿里的镜像加速器、如果你的机房在国外,这个都可以省略。

 

# cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF

  

 

 

查看相关docker 版本

2\安装K8S相关工具

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
setenforce 0

 

 

 由于版本更新频繁,这里指定版本号部署:

$ yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0
$ systemctl enable kubelet

  

安装完毕 先不要着着急去起kubelet  

因为你现在肯定起步起来

 

 

 

 

 

然后查看依赖:

 kubeadm version 看kubeadm 版本依赖


kubeadm config images list --kubernetes-version v1.17.3
拉去镜像:

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5

修改tag:

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.3 k8s.gcr.io/kube-apiserver:v1.17.3
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.3 k8s.gcr.io/kube-controller-manager:v1.17.3
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.3 k8s.gcr.io/kube-scheduler:v1.17.3
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.3 k8s.gcr.io/kube-proxy:v1.17.3
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5 k8s.gcr.io/coredns:1.6.5

 

下载镜像
kubeadm config images list | sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g' | sh -x
修改名称
docker images | grep registry.cn-hangzhou.aliyuncs.com/google_containers | awk '{print "docker tag",$1":"$2,$1":"$2}' | sed -e 's/registry.cn-hangzhou.aliyuncs.com\/google_containers/k8s.gcr.io/2' | sh -x
删除原镜像
docker images | grep registry.cn-hangzhou.aliyuncs.com/google_containers | awk '{print "docker rmi """$1""":"""$2}' | sh -x

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

是不是觉得上面太费劲了呢?还有另一种方式去拉取镜像,就是使用aliyun镜像去拉取k8s的相关镜像。在使用kubeadm 指定拉取aliyun镜像就好了。记得配置aliyun的镜像加速哦!

  

kubeadm version  查看k8s版本

$ kubeadm init \
  --apiserver-advertise-address=192.168.1.5 \ #就是你master的地址,容器通信监听地址   
  --image-repository registry.aliyuncs.com/google_containers \  #指定阿里云镜像
  --kubernetes-version v1.17.0 \  #k8s版本,需要和你安装k8s工具版本对应上
  --service-cidr=10.96.0.0/12 \   #负载均衡的,service 网段 虚拟ip 
  --pod-network-cidr=10.244.0.0/16 \ #容器pod网络  虚拟ip
--ignore-preflight-errors=NumCPU #因为我的虚拟机只给了一课cpu所以会报错的,这里我加这个忽略这个错误。

  kubeadm init   --apiserver-advertise-address=192.168.1.19   --image-repository registry.aliyuncs.com/google_containers   --kubernetes-version v1.17.0   --service-cidr=10.96.0.0/12   --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=NumCPU 

执行初始化

kubeadm init --kubernetes-version=v1.17.3 --pod-network-cidr=10.152.0.0/16 --ignore-preflight-errors=NumCPU

要加或略 cpu个数问题

不然执行不下去
[WARNING NumCPU]: the number of available CPUs 1 is less than the required 2

最后你会看到这个

 

 出现这个表示你先已经安装好k8S了,根据提示去创建路径就好了。后面的那个token 就是将别的节点加入到集群的密钥

最后我们看一下kubelet 有没有启动好!

 

 啊里开源镜像站 ,他们让你起kubelet 服务你会发现是起不起来的,因为kubeamd 还没初始化,就会起不了。这是个人心得,如果大佬看了,觉得我说的不对,请大佬告知,我修改一下!!

 

 

其实无所谓的,你执行一般也是没有问题,最终还是执行enable

 

在添加的node的节点的时候呢,会报错cgroupfs 一个错误 具体解决方案:

https://kubernetes.io/docs/setup/production-environment/container-runtimes/

 

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

# Restart Docker
systemctl daemon-reload
systemctl restart docker

  

modprobe overlay
modprobe br_netfilter

# Setup required sysctl params, these persist across reboots.
cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

 

# Install prerequisites
yum-config-manager --add-repo=https://cbs.centos.org/repos/paas7-crio-115-release/x86_64/os/

# Install CRI-O
yum install --nogpgcheck -y cri-o

  

systemctl daemon-reload
systemctl start crio

 

 ---------------------------------------------------------------------------------------------------------------------------------------

漏了一个东西,补充一下

在我们执行完初始化操作后,执行 kubectl get pods -o wide -n kube-system  可以看到我们的dns 一直是pending 的状态,这时候就需要我们安装一个网络控件

相关解决方法:

For more information on setting up your Kubernetes cluster with Weave Net, please see [Integrating Kubernetes via the Addon]((https://www.weave.works/docs/net/latest/kube-addon/).

Weave Net works on amd64, arm, arm64 and ppc64le platforms without any extra action required. Weave Net sets hairpin mode by default. This allows Pods to access themselves via their Service IP address if they don’t know their PodIP.

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

  

 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

 

 

 ---------------------------------------------------------------------------------------------------------------------------------------

在kuberctl get node 

 

 node 节点是not ready  这个就是因 cgroupfs引起的。 其实怎么处理已经提示出来了 

 

 链接都给出来了,直接一顿猛虎操作。

回头我们在看nodes

 

 我们还可以看 所有namespace 运行状态

kubectl get pods --all-namespaces

 

在建立好k8s 之后,你又想加入node了,那么你会发现加入不了了。

这个时候,我要告诉你,你的token 过期,默认tonken 都是有期限的。

执行下面命令 创建吧!!

kubeadm create token  默认 24小时过期

kubeadm token create --ttl 0 永不过期的token 

打印全面的信息直接复制加入节点

kubeadm token create --print-join-command

  

# kubeadm token create
# kubeadm token list
# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
63bca849e0e01691ae14eab449570284f0c3ddeea590f8da988c07fe2729e924

# kubeadm join 192.168.31.61:6443 --token nuja6n.o3jrhsffiqs9swnu --discovery-token-ca-cert-hash sha256:63bca849e0e01691ae14eab449570284f0c3ddeea590f8da988c07fe2729e924

  

 

官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-token/

 

以上是我遇到的问题,以及解决方案,可能有点复杂,后面我在优化,优化。

 总结一下:

kubeadm init引导过程:
1、检查系统环境是否满足,例如swap是否关闭、配置是否满足
2、下载所需镜像,kubeadm config images pull
3、为kubelet创建配置文件并启动
4、为apiserver、etcd生成https证书(/etc/kubernetes/pki/)
5、生成连接apiserver的kubeconfig文件
6、容器启动master组件
7、将涉及的配置文件存储到configmap
8、设置master节点不可调度Pod
9、启用bootstrap自动为kubelet颁发证书
10、安装插件:CoreDNS、kube-proxy
最后一步,提示你拷贝连接k8s集群的配置文件。

这些问题其实本身并不复杂,根本原因是因为k8s的镜像都在GC上,国内、本地的网络环境无法访问,所以导致这么小折腾,如你在AWS上部署k8S就不会有那么多麻烦的事情了。

posted @ 2020-03-13 17:01  菜菜920  阅读(538)  评论(0编辑  收藏  举报