关于安装方式,目前除去云服务商自己提供的K8S集群服务, 本地集群安装方式主要有3种:html
一、基于yum直接将相关组件部署为系统级守护进程,缺点:controller-manager故障,须要手动重启;node
节点网络:192.168.0.0/16linux
Pod网络地址:10.244.0.0/16git
Service网络地址:10.96.0.0/12 //掩码是12位的github
etcd部署在master节点上,不独立;docker
二、使用kubeadm进行部署,将k8s的核心组件部署为pod,但须要在master和node上手动部署kubelet和docker(docker是运行容器的引擎,kubelet是运行pod化的容器的核心组件);json
使用kubeadm进行部署,每个节点都须要做为k8s底层的docker运行的节点,即包括master都须要安装docker,同时每个节点都须要安装、运行kubelet、docker,而且确保这二者启动并运行。把第一个节点初始化为master,把其余节点初始化为node。将master上的组件API Server、etcd、controller-manager、scheduler都运行为pod(都是静态pod,不受k8s管理,只是运行为pod的形式),即都跑在kubelet之上,以容器化的形式运行(k8s本身的组件都运行为pod)。node上将kube-proxy运行为Pod。每个节点包括master都须要以pod运行flannel(动态pod,由k8s自身管理),vim
k8s在github上的地址:https://github.com/kubernetescentos
kubeadm初始化、安装集群的步骤:api
一、master、nodes:安装kubelet、kubeadm、docker
二、master:kubeadm init //在master运行kubeadm init,初始化集群
三、nodes:kubeadm join //在各nodes节点执行kubeadm join,将节点加入到集群中去
部署环境
master:IP:192.168.184.141 主机名:master
node1: IP:192.168.184.142 主机名:node01
node2: IP:192.168.184.143 主机名:node02
连接地址:https://github.com/kubernetes/kubernetes/releases?after=v1.13.0-alpha.0
将master和node节点分开下载(注意这是第一种安装方式,即将k8s的组件以系统级守护进程来运行)
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.11.md#v1111
注意:不管是master仍是node,用到的都是server端的安装包,因为在服务器本地也要执行一些客户端的命令,因此也须要将客户端的安装包下载下来。
下面以第二种安装方式,即kubeadm安装k8s,这里使用阿里云利用yum进行安装
注意:iptables和firewalld必定不能启用,由于在安装k8s时会大量操做iptables规则
阿里云镜像连接 https://mirrors.aliyun.com/kubernetes/
一、首先部署docker的yum仓库 https://mirrors.aliyun.com/docker-ce/linux/centos/
master ~]# cd /etc/yum.repos.d/
master yum.repos.d]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
master yum.repos.d]# vim docker-ce.repo //能够看出已经指向阿里云的仓库连接了
二、配置k8s的yum仓库
master ~]# cd /etc/yum.repos.d/
master yum.repos.d]# vim kubernets.repo
1 [kubernetes] 2 name=Kubernetes Repo 3 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ 4 gpgcheck=1 5 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg 6 enabled=1
三、初始化k8s和docker的yum仓库
master yum.repos.d]# yum repolist
将k8s和docker的yum仓库发送至node01和node02节点
master yum.repos.d]# scp kubernets.repo docker-ce.repo node01:/etc/yum.repos.d/
master yum.repos.d]# scp kubernets.repo docker-ce.repo node02:/etc/yum.repos.d/
四、在master上安装docker和k8s
master yum.repos.d]# yum install docker-ce kubelet kubeadm kubectl //kubectl是API Server的命令行客户端
在安装过程出现k8s无gpg-key的问题,就手动导入
master yum.repos.d]# vim kubernets.repo //将gpgcheck=0
master ~]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg //下载yum检查密钥,注意路径
master ~]# rpm --import yum-key.gpg //导入密钥
master ~]# yum install docker-ce kubelet kubeadm kubectl //在此进行安装
五、初始化docker和k8s并启动
docker须要到docker仓库中下载所依赖的每个镜像文件,这些镜像文件有时多是没法获取的,因此能够利用其余方法加载镜像文件再导入进来。因为kubeadm是支持直接使用本地当中已有的镜像文件或者使用本地私有仓库做为镜像的下载路径的。这里并不适用此方法,而是使用代理路径来获取并下载相关镜像文件。
master ~]# vim /usr/lib/systemd/system/docker.service //修改此文件,定义一个环境变量
[Service]
Environment="HTTPS_PROXY=http://www.ik8s.io:10080" //在访问https服务时,经过访问代理来加载相关的镜像文件,加载完以后能够把此行注释掉
Environment="NO_PROXY=127.0.0.0/8,192.168.184.0/24" //此行表示不作代理
master ~]# systemctl daemon-reload
master ~]# systemctl start docker
master ~]# docker info
因为docker会大量生成iptables规则,可能须要打开bridge-nf-call-ip6tables和bridge-nf-call-iptables的桥接功能
[root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-ip6tables
1 //肯定这两个参数都是1
[root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-iptables
1
以上docker就设定成功
master ~]# rpm -ql kubelet
/etc/kubernetes/manifests //清单目录
/etc/sysconfig/kubelet //配置文件
/usr/bin/kubelet //主程序
/usr/lib/systemd/system/kubelet.service //unit file
master ~]# systemctl enable kubelet //先不要启动kubelet,由于尚未初始化完成
master ~]# kubeadm init --help //查看初始化选项
kubeadm初始化选项和命令:https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
--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文件 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', 令牌将永不过时
master ~]# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.14.2
k8s.gcr.io/kube-controller-manager:v1.14.2
k8s.gcr.io/kube-scheduler:v1.14.2
k8s.gcr.io/kube-proxy:v1.14.2
k8s.gcr.io/pause:3.1 //pause的做用是好比一个容器能够不用启动,随后其余容器启动时能够加入复制这个容器的网络和存储卷,这个容器称为基础架构容器。
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1
master ~]# kubeadm init --kubernetes-version=v1.14.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/16
master ~]# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
master ~]# kubeadm init --kubernetes-version=v1.14.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/16 --ignore-preflight-errors=Swap
可是出现了拉取镜像失败的问题,缘由多是没法访问google的
cgroup驱动程序错误解决方法:https://kubernetes.io/docs/setup/cri/
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
master ~]# swapoff -a
永久禁用swap分区:
注释掉/etc/fstab文件中"/dev/mapper/centos-swap"这一行:
Kubernetes:如何解决从k8s.gcr.io拉取镜像失败问题:
https://blog.csdn.net/jinguangliu/article/details/82792617
http://www.javashuo.com/article/p-nkgyjeuq-ev.html
此方式是docker.io仓库对google的容器作了镜像,能够经过下列命令下拉取相关镜像:
#docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.14.2 //先手动拉取镜像
master ~]# docker pull coredns/coredns:1.3.1
根据安装版本信息进行相应的修改。经过docker tag命令来修改镜像的标签:
#docker tag docker.io/mirrorgooglecontainers/kube-proxy-amd64:v1.14.2 k8s.gcr.io/kube-proxy-amd64:v1.14.2
上述拉取镜像自动化:https://blog.51cto.com/nhylovezyh/2377982
解决上述问题后再次执行master ~]# kubeadm init --kubernetes-version=v1.14.2...便可成功
此段代码是须要用到
Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.184.141:6443 --token c6iiam.88h3alqgl9pewtsw --discovery-token-ca-cert-hash sha256:68672b008c52eca6623e875401cc99cdd0942ce359c6345ddbc57ce1e59be4ea
master ~]# ss -tnl
问题:API Server没有启动,没有监听6443端口
The connection to the server 192.168.184.141:6443 was refused - did you specify the right host or port?
注意:若是服务器不当心重启,kubelet没法从新启动,解决方案:https://www.jianshu.com/p/39896f2e429d
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config //admin.conf是kubeadm自动初始化好的一个文件,它能够被kubectl拿来做为配置文件,指定链接至k8s的API Server并完成认证。
[root@master ~]# chown $(id -u):$(id -g) $HOME/.kube/config //若是管理员执行上述两个操做,此步就取消
[root@master ~]# kubectl get componentstatus //这里能正常显示信息,说明API Server是正常的
[root@master ~]# kubectl get nodes //查看节点
NAME STATUS ROLES AGE VERSION
master NotReady master 7h12m v1.14.2
//NotReady此时master是未就绪状态,由于缺乏flannel或者Calico这样的网络组件
下面在master服务器上部署flannel网络组件 https://github.com/coreos/flannel
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml //执行此命令,会自动在线获取部署清单,并基于此清单下载镜像,启动并部署flannel
[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
podsecuritypolicy.extensions/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.extensions/kube-flannel-ds-amd64 created daemonset.extensions/kube-flannel-ds-arm64 created daemonset.extensions/kube-flannel-ds-arm created daemonset.extensions/kube-flannel-ds-ppc64le created daemonset.extensions/kube-flannel-ds-s390x created
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 7h30m v1.14.2 //此时master已经ready状态
[root@master ~]# kubectl get pods -n kube-system //kube-system是一个名称空间
列表中显示的是当前全部运行的pod,而且属于kube-system名称空间,若是不指明的名称空间的话,那就属于kubernetes集群默认的名称空间,即defaults。
[root@master ~]# kubectl get ns //查看k8s集群的名称空间
NAME STATUS AGE //四个名称空间
default Active 7h41m
kube-node-lease Active 7h41m
kube-public Active 7h41m
kube-system Active 7h41m //系统级别的pod都在kube-system名称空间中
以上master节点算是安装完成,只要node节点安装成功,更改docker文件(获取镜像文件),启动docker并开机启动docker和k8s,再设置kubelet swap文件,再初始化k8s集群(将node节点加入到集群中)就能够了。
一、首先将master节点的yum仓库复制到node01和node02
master ~]# scp yum-key.gpg node01:/root node01:/root
master ~]# scp /etc/yum.repos.d/kubernets.repo node01:/etc/yum.repos.d/
master ~]# scp /etc/yum.repos.d/docker-ce.repo node01:/etc/yum.repos.d/
二、安装docker-ce和kubernetes
node1 ~]# rpm --import yum-key.gpg //首先导入yum密钥文件
node1 ~]# yum install docker-ce kubelet kubeadm
node01(192.168.184.142)节点已经安装成功,下面对node01节点进行初始化
首先设置docker.service文件,能够下载镜像文件,可是这里不能访问Google的镜像文件,只能手动下载
master ~]# scp /usr/lib/systemd/system/docker.service node01:/usr/lib/systemd/system/docker.service
master ~]# scp /etc/sysconfig/kubelet node01:/etc/sysconfig/
KUBELET_EXTRA_ARGS="--fail-swap-on=false" //文件中的内容
这里依然须要解决:cgroup驱动程序错误解决方法:https://kubernetes.io/docs/setup/cri/,前文已有叙述。
[root@node01 ~]# systemctl start docker
[root@node01 ~]# docker info
[root@node01 ~]# systemctl enable docker kubelet //开机启动
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
node01 ~]# kubeadm join 192.168.184.141:6443 --token c6iiam.88h3alqgl9pewtsw --discovery-token-ca-cert-hash sha256:68672b008c52eca6623e875401cc99cdd0942ce359c6345ddbc57ce1e59be4ea --ignore-preflight-errors=Swap //初始化集群
此时须要等待node01节点须要下载kube_proxy镜像和flannel镜像,并启动起来,node节点才算真正初始化完成。
在master节点能够查看到node01节点已经加进集群,可是没有初始化完成
node01 ~]# docker pull quay.io/coreos/flannel:v0.11.0
node01 ~]# docker pull mirrorgooglecontainers/kube-proxy:v1.14.2
node01 ~]# docker tag mirrorgooglecontainers/kube-proxy:v1.14.2 k8s.gcr.io/kube-proxy:v1.14.2
node01 ~]# docker rmi mirrorgooglecontainers/kube-proxy:v1.14.2
node01 ~]# docker pull mirrorgooglecontainers/pause:3.1
node01 ~]# docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
node01 ~]# docker rmi mirrorgooglecontainers/pause:3.1
一、首先复制masetr节点上配置好的docker和k8s的yum仓库文件
master ~]# scp yum-key.gpg node02:/root
master ~]# scp /etc/yum.repos.d/kubernets.repo node02:/etc/yum.repos.d/
master ~]# scp /etc/yum.repos.d/docker-ce.repo node02:/etc/yum.repos.d/
二、在node02节点安装docker和k8s
node02 ~]# yum install docker-ce kubeadm kubelet
node02 ~]# vim /usr/lib/systemd/system/docker.service
Environment="NO_PROXY=127.0.0.1/8,192.168.184.0/24" //在文件中service段落中添加此行
node02 ~]# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
cgroup驱动程序错误解决方法:https://kubernetes.io/docs/setup/cri/
node02 ~]# swapoff -a //关闭swap分区
node02 ~]# systemctl daemon-reload
node02 ~]# systemctl enable docker
node02 ~]# systemctl start docker
node02 ~]# systemctl enable kubelet
三、拉取镜像
node02 ~]# docker pull quay.io/coreos/flannel:v0.11.0
node02 ~]# docker pull mirrorgooglecontainers/kube-proxy:v1.14.2
node02 ~]# docker tag mirrorgooglecontainers/kube-proxy:v1.14.2 k8s.gcr.io/kube-proxy:v1.14.2
node02 ~]# docker rmi mirrorgooglecontainers/kube-proxy:v1.14.2
node02 ~]# docker pull mirrorgooglecontainers/pause:3.1
node02 ~]# docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
node02 ~]# docker rmi mirrorgooglecontainers/pause:3.1
四、初始化k8s集群
node02 ~]# kubeadm join 192.168.184.141:6443 --token c6iiam.88h3alqgl9pewtsw --discovery-token-ca-cert-hash sha256:68672b008c52eca6623e875401cc99cdd0942ce359c6345ddbc57ce1e59be4ea --ignore-preflight-errors=Swap //注意口令是会过时的,要注意更新
kubeadm 生成的token过时后,集群增长节点 https://www.jianshu.com/p/a5e379638577
master ~]# kubectl get pods -n kube-system -o wide