朴亨日 發表於 2019-12-25 21:57:00

学习kubernetes——搭建kubernetes集群

<p>  学习k8s的最好方式是自己搭建一个k8s集群,并实际操作。按照官方教程,其实并不复杂,但是由于网络问题,很多软件和镜像无法下载,所以安装过程还是比较麻烦的。</p>
<p>  学习k8s并不需要集群环境,个人电脑就可以搭建一个单机集群来学习。下面简单介绍下过程,会跳过比较简单的步骤,重点说下需要注意的事项</p>
<h2>一、安装虚拟机和linux系统</h2>
<p>  虚拟机可以使用hyper-v,virtualbox,和vmware。我用的是VirtualBox 6.1.0版本,下载地址是https://www.virtualbox.org/wiki/Downloads。</p>
<p>  系统用的是CentOS-7-x86_64-Minimal-1908。学习用的话建议使用Minimal,下载和安装都很快。下载地址是&nbsp;http://isoredirect.centos.org/centos/7/isos/x86_64/,选择一个速度较快的镜像地址下载。</p>
<p>  安装教程,网上很多,这里就不说了。需要建议的地方是,1、安装语言选择中文。2、软件选择最小安装,禁用KDUMP;配置网络连接</p>
<p><img src="https://img2018.cnblogs.com/blog/1101848/201912/1101848-20191229095817365-1273065261.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>  注意:1、虚拟机配置中设置CPU个数为2或者以上</p>
<p>     2、内存设置为2G以上</p>
<p>     3、防火墙会给k8s集群带来一些问题,这里仅为学习用,可以直接关闭防火墙。systemctl stop firewalld &amp; systemctl disable firewalld</p>
<p>     4、关闭Swap。执行swapoff -a可临时关闭,编辑/etc/fstab,注释掉包含swap的那一行即可,重启后可永久关闭</p>
<p>     5、关闭centos图形登录界面,systemctl set-default multi-user.target</p>
<p>     6、添加额外的网卡,仅主机(Host-Only)网络,这样就可以从主机之间访问虚拟机</p>
<h2>二、安装docker</h2>
<p>  首先参考官方文档</p>
<p>  https://docs.docker.com/install/linux/docker-ce/centos/#prerequisites</p>
<p>  https://kubernetes.io/docs/setup/production-environment/container-runtimes/</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"># Install Docker CE
## Set up the repository
### Install required packages.
</span><span style="color: rgba(0, 0, 255, 1)">yum</span> <span style="color: rgba(0, 0, 255, 1)">install</span> <span style="color: rgba(0, 0, 255, 1)">yum</span>-utils device-mapper-persistent-<span style="color: rgba(0, 0, 0, 1)">data lvm2

### Add Docker repository.
## 注意换成阿里云地址
</span><span style="color: rgba(0, 0, 255, 1)">yum</span>-config-manager --add-<span style="color: rgba(0, 0, 0, 1)">repo \
https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</span>
<span style="color: rgba(0, 0, 0, 1)">
## Install Docker CE.
</span><span style="color: rgba(0, 0, 255, 1)">yum</span> update &amp;&amp; <span style="color: rgba(0, 0, 255, 1)">yum</span> <span style="color: rgba(0, 0, 255, 1)">install</span><span style="color: rgba(0, 0, 0, 1)"> \
containerd.io</span>-<span style="color: rgba(128, 0, 128, 1)">1.2</span>.<span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)"> \
docker</span>-ce-<span style="color: rgba(128, 0, 128, 1)">19.03</span>.<span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)"> \
docker</span>-ce-cli-<span style="color: rgba(128, 0, 128, 1)">19.03</span>.<span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">

## Create </span>/etc/<span style="color: rgba(0, 0, 0, 1)">docker directory.
</span><span style="color: rgba(0, 0, 255, 1)">mkdir</span> /etc/<span style="color: rgba(0, 0, 0, 1)">docker

# Setup daemon.
</span><span style="color: rgba(0, 0, 255, 1)">cat</span> &gt; /etc/docker/daemon.json &lt;&lt;<span style="color: rgba(0, 0, 0, 1)">EOF
{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">exec-opts</span><span style="color: rgba(128, 0, 0, 1)">"</span>: [<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">native.cgroupdriver=systemd</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">],
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">log-driver</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">json-file</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">log-opts</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">max-size</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">100m</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
},
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">storage-driver</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">overlay2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">storage-opts</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: [
    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">overlay2.override_kernel_check=true</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
]
}
EOF

</span><span style="color: rgba(0, 0, 255, 1)">mkdir</span> -p /etc/systemd/system/<span style="color: rgba(0, 0, 0, 1)">docker.service.d

# Restart Docker
systemctl daemon</span>-<span style="color: rgba(0, 0, 0, 1)">reload
systemctl restart docker</span></pre>
</div>
<p>&nbsp;</p>
<p>  设置开机启动</p>
<div class="cnblogs_code">
<pre>systemctl start docker &amp; systemctl enable docker</pre>
</div>
<p>&nbsp;</p>
<p>  验证安装是否成功</p>
<div class="cnblogs_code">
<pre>docker run hello-world</pre>
</div>
<p>  结果如下</p>
<div class="cnblogs_code">
<pre>Hello from Docker!<span style="color: rgba(0, 0, 0, 1)">
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">. The Docker client contacted the Docker daemon.
</span><span style="color: rgba(128, 0, 128, 1)">2</span>. The Docker daemon pulled the <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">hello-world</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> image from the Docker Hub.
    (amd64)
</span><span style="color: rgba(128, 0, 128, 1)">3</span>. The Docker daemon created a new container from that image <span style="color: rgba(0, 0, 255, 1)">which</span><span style="color: rgba(0, 0, 0, 1)"> runs the
    executable that produces the output you are currently reading.
</span><span style="color: rgba(128, 0, 128, 1)">4</span>. The Docker daemon streamed that output to the Docker client, <span style="color: rgba(0, 0, 255, 1)">which</span><span style="color: rgba(0, 0, 0, 1)"> sent it
    to your terminal.

To try something </span><span style="color: rgba(0, 0, 255, 1)">more</span><span style="color: rgba(0, 0, 0, 1)"> ambitious, you can run an Ubuntu container with:
$ docker run </span>-<span style="color: rgba(0, 0, 0, 1)">it ubuntu bash

Share images, automate workflows, and </span><span style="color: rgba(0, 0, 255, 1)">more</span> with a <span style="color: rgba(0, 0, 255, 1)">free</span><span style="color: rgba(0, 0, 0, 1)"> Docker ID:
https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">hub.docker.com/</span>
<span style="color: rgba(0, 0, 0, 1)">
For </span><span style="color: rgba(0, 0, 255, 1)">more</span><span style="color: rgba(0, 0, 0, 1)"> examples and ideas, visit:
https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">docs.docker.com/get-started/</span></pre>
</div>
<p>&nbsp;</p>
<h2>三、安装Kubernetes</h2>
<p>  官方文档https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/</p>
<p>  注意:需要改成国内的镜像地址</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">cat</span> &lt;&lt;EOF &gt; /etc/<span style="color: rgba(0, 0, 255, 1)">yum</span>.repos.d/<span style="color: rgba(0, 0, 0, 1)">kubernetes.repo

name</span>=<span style="color: rgba(0, 0, 0, 1)">Kubernetes
baseurl</span>=https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64</span>
enabled=<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
gpgcheck</span>=<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
repo_gpgcheck</span>=<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
gpgkey</span>=https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg </span><span style="color: rgba(0, 128, 0, 1); text-decoration: underline">https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg</span>
<span style="color: rgba(0, 0, 0, 1)">EOF

# Set SELinux </span><span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> permissive mode (effectively disabling it)
setenforce </span><span style="color: rgba(128, 0, 128, 1)">0</span>
<span style="color: rgba(0, 0, 255, 1)">sed</span> -i <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">s/^SELINUX=enforcing$/SELINUX=permissive/</span><span style="color: rgba(128, 0, 0, 1)">'</span> /etc/selinux/<span style="color: rgba(0, 0, 0, 1)">config

</span><span style="color: rgba(0, 0, 255, 1)">yum</span> <span style="color: rgba(0, 0, 255, 1)">install</span> -y kubelet kubeadm kubectl --disableexcludes=<span style="color: rgba(0, 0, 0, 1)">kubernetes

systemctl enable </span>--now kubelet</pre>
</div>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">cat</span> &lt;&lt;EOF &gt;/etc/sysctl.d/<span style="color: rgba(0, 0, 0, 1)">k8s.conf
net.bridge.bridge</span>-nf-call-ip6tables = <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
net.bridge.bridge</span>-nf-call-iptables = <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
EOF
sysctl </span>--system</pre>
</div>
<p>&nbsp;</p>
<p>  设置自启动</p>
<div class="cnblogs_code">
<pre>systemctl enable kubelet &amp;&amp; systemctl start kubelet</pre>
</div>
<p>&nbsp;</p>
<h2>四、配置K8S单机集群</h2>
<p>  这里使用Calico方案来部署k8s单机集群</p>
<p>  官方文档:https://docs.projectcalico.org/v3.11/getting-started/kubernetes/</p>
<p>  初始换环境,并下载安装k8s镜像</p>
<div class="cnblogs_code">
<pre>kubeadm init --pod-network-cidr=<span style="color: rgba(255, 0, 0, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>/<span style="color: rgba(128, 0, 128, 1)">16</span></pre>
</div>
<p>  注意ip地址根据实际情况更改</p>
<p>  由于这一步需要下载k8s的docker镜像,国内不用代理的话基本上是下载不下来的。所以这里会出错,出错的原因就是镜像pull失败。会出现类似下面的错误信息</p>
<div class="cnblogs_code">
<pre>W1229 <span style="color: rgba(128, 0, 128, 1)">11</span>:<span style="color: rgba(128, 0, 128, 1)">23</span>:<span style="color: rgba(128, 0, 128, 1)">22.589295</span>    <span style="color: rgba(128, 0, 128, 1)">1688</span> version.go:<span style="color: rgba(128, 0, 128, 1)">101</span>] could not fetch a Kubernetes version <span style="color: rgba(0, 0, 255, 1)">from</span> the internet: unable to <span style="color: rgba(0, 0, 255, 1)">get</span> URL <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://dl.k8s.io/release/stable-1.txt</span><span style="color: rgba(128, 0, 0, 1)">"</span>: Get https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">dl.k8s.io/release/stable-1.txt: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)</span>
W1229 <span style="color: rgba(128, 0, 128, 1)">11</span>:<span style="color: rgba(128, 0, 128, 1)">23</span>:<span style="color: rgba(128, 0, 128, 1)">22.590166</span>    <span style="color: rgba(128, 0, 128, 1)">1688</span> version.go:<span style="color: rgba(128, 0, 128, 1)">102</span>] falling back to the local client version: v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span><span style="color: rgba(0, 0, 0, 1)">
W1229 </span><span style="color: rgba(128, 0, 128, 1)">11</span>:<span style="color: rgba(128, 0, 128, 1)">23</span>:<span style="color: rgba(128, 0, 128, 1)">22.590472</span>    <span style="color: rgba(128, 0, 128, 1)">1688</span> validation.go:<span style="color: rgba(128, 0, 128, 1)">28</span>] Cannot validate kube-proxy config - no validator <span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> available
W1229 </span><span style="color: rgba(128, 0, 128, 1)">11</span>:<span style="color: rgba(128, 0, 128, 1)">23</span>:<span style="color: rgba(128, 0, 128, 1)">22.590492</span>    <span style="color: rgba(128, 0, 128, 1)">1688</span> validation.go:<span style="color: rgba(128, 0, 128, 1)">28</span>] Cannot validate kubelet config - no validator <span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> available
Using Kubernetes version: v1.</span><span style="color: rgba(128, 0, 128, 1)">17.0</span><span style="color: rgba(0, 0, 0, 1)">
Running pre</span>-<span style="color: rgba(0, 0, 0, 1)">flight checks
      : firewalld </span><span style="color: rgba(0, 0, 255, 1)">is</span> active, please ensure ports [<span style="color: rgba(128, 0, 128, 1)">6443</span> <span style="color: rgba(128, 0, 128, 1)">10250</span><span style="color: rgba(0, 0, 0, 1)">] are open or your cluster may not function correctly</span><span style="color: rgba(0, 0, 0, 1)">
Pulling images required </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> setting up a Kubernetes cluster
This might take a minute or two, depending on the speed of your internet connection
You can also perform </span><span style="color: rgba(0, 0, 255, 1)">this</span> action <span style="color: rgba(0, 0, 255, 1)">in</span> beforehand <span style="color: rgba(0, 0, 255, 1)">using</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">kubeadm config images pull</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
error execution phase preflight: Some fatal errors occurred:
      : failed to pull image k8s.gcr.io</span>/kube-apiserver:v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span>: output: Error response <span style="color: rgba(0, 0, 255, 1)">from</span> daemon: Get https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)</span>
, error: exit status <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
      : failed to pull image k8s.gcr.io</span>/kube-controller-manager:v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span>: output: Error response <span style="color: rgba(0, 0, 255, 1)">from</span> daemon: Get https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)</span>
, error: exit status <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
      : failed to pull image k8s.gcr.io</span>/kube-scheduler:v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span>: output: Error response <span style="color: rgba(0, 0, 255, 1)">from</span> daemon: Get https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)</span>
, error: exit status <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
      : failed to pull image k8s.gcr.io</span>/kube-proxy:v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span>: output: Error response <span style="color: rgba(0, 0, 255, 1)">from</span> daemon: Get https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)</span>
, error: exit status <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
      : failed to pull image k8s.gcr.io</span>/pause:<span style="color: rgba(128, 0, 128, 1)">3.1</span>: output: Error response <span style="color: rgba(0, 0, 255, 1)">from</span> daemon: Get https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)</span>
, error: exit status <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
      : failed to pull image k8s.gcr.io</span>/etcd:<span style="color: rgba(128, 0, 128, 1)">3.4</span>.<span style="color: rgba(128, 0, 128, 1)">3</span>-<span style="color: rgba(128, 0, 128, 1)">0</span>: output: Error response <span style="color: rgba(0, 0, 255, 1)">from</span> daemon: Get https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)</span>
, error: exit status <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
      : failed to pull image k8s.gcr.io</span>/coredns:<span style="color: rgba(128, 0, 128, 1)">1.6</span>.<span style="color: rgba(128, 0, 128, 1)">5</span>: output: Error response <span style="color: rgba(0, 0, 255, 1)">from</span> daemon: Get https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)</span>
, error: exit status <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
If you know what you are doing, you can make a check non</span>-fatal with `--ignore-preflight-errors=<span style="color: rgba(0, 0, 0, 1)">...`
To see the stack trace of </span><span style="color: rgba(0, 0, 255, 1)">this</span> error execute with --v=<span style="color: rgba(128, 0, 128, 1)">5</span> or higher</pre>
</div>
<p>  </p>
<p>  执行这个解决防火墙警告</p>
<p>  </p>
<div class="cnblogs_code">
<pre>firewall-cmd --permanent --add-port=<span style="color: rgba(128, 0, 128, 1)">6443</span>/tcp &amp;&amp; sudo firewall-cmd --permanent --add-port=<span style="color: rgba(128, 0, 128, 1)">10250</span>/tcp &amp;&amp; sudo firewall-cmd --reload</pre>
</div>
<p>&nbsp;</p>
<p>  失败信息中给出了pull失败的镜像地址。github上有人已经下载所有的镜像并上传到国内地址,可以从那下载。</p>
<p>  github地址:https://github.com/anjia0532/gcr.io_mirror</p>
<p>  镜像地址转换规则</p>
<p>  </p>
<div class="cnblogs_code">
<pre>gcr.io/namespace/<span style="color: rgba(0, 0, 0, 1)">image_name:image_tag
#eq
gcr.azk8s.cn</span>/namespace/<span style="color: rgba(0, 0, 0, 1)">image_name:image_tag

# special
k8s.gcr.io</span>/{image}/{tag} &lt;==&gt; gcr.io/google-containers/{image}/{tag} &lt;==&gt; gcr.azk8s.cn/namespace/image_name:image_tag </pre>
</div>
<p>  例如上面初始话下载失败的镜像地址是k8s.gcr.io/kube-apiserver:v1.17.0。</p>
<div class="cnblogs_code">
<pre>k8s.gcr.io/kube-apiserver:v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span><span style="color: rgba(0, 0, 0, 1)">
转换为
gcr.azk8s.cn</span>/google-containers/kube-apiserver:v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span></pre>
</div>
<p>  下载镜像</p>
<div class="cnblogs_code">
<pre>docker pull gcr.azk8s.cn/google-containers/kube-controller-manager:v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span><span style="color: rgba(0, 0, 0, 1)">
docker pull gcr.azk8s.cn</span>/google-containers/kube-scheduler:v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span><span style="color: rgba(0, 0, 0, 1)">
docker pull gcr.azk8s.cn</span>/google-containers/kube-proxy:v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span><span style="color: rgba(0, 0, 0, 1)">
docker pull gcr.azk8s.cn</span>/google-containers/pause:<span style="color: rgba(128, 0, 128, 1)">3.1</span><span style="color: rgba(0, 0, 0, 1)">
docker pull gcr.azk8s.cn</span>/google-containers/etcd:<span style="color: rgba(128, 0, 128, 1)">3.4</span>.<span style="color: rgba(128, 0, 128, 1)">3</span>-<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
docker pull gcr.azk8s.cn</span>/google-containers/coredns:<span style="color: rgba(128, 0, 128, 1)">1.6</span>.<span style="color: rgba(128, 0, 128, 1)">5</span></pre>
</div>
<p>&nbsp;</p>
<p>  由于,kubeadm init拉取的镜像地址是官方的地址,因此我们需要打对应的tag</p>
<div class="cnblogs_code">
<pre>docker tag gcr.azk8s.cn/google-containers/kube-apiserver:v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span> k8s.gcr.io/kube-apiserver:v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span><span style="color: rgba(0, 0, 0, 1)">
docker tag gcr.azk8s.cn</span>/google-containers/kube-controller-manager:v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span> k8s.gcr.io/kube-controller-manager:v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span><span style="color: rgba(0, 0, 0, 1)">
docker tag gcr.azk8s.cn</span>/google-containers/kube-scheduler:v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span> k8s.gcr.io/kube-scheduler:v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span><span style="color: rgba(0, 0, 0, 1)">
docker tag gcr.azk8s.cn</span>/google-containers/kube-proxy:v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span> k8s.gcr.io/kube-proxy:v1.<span style="color: rgba(128, 0, 128, 1)">17.0</span><span style="color: rgba(0, 0, 0, 1)">
docker tag gcr.azk8s.cn</span>/google-containers/pause:<span style="color: rgba(128, 0, 128, 1)">3.1</span> k8s.gcr.io/pause:<span style="color: rgba(128, 0, 128, 1)">3.1</span><span style="color: rgba(0, 0, 0, 1)">
docker tag gcr.azk8s.cn</span>/google-containers/etcd:<span style="color: rgba(128, 0, 128, 1)">3.4</span>.<span style="color: rgba(128, 0, 128, 1)">3</span>-<span style="color: rgba(128, 0, 128, 1)">0</span> k8s.gcr.io/etcd:<span style="color: rgba(128, 0, 128, 1)">3.4</span>.<span style="color: rgba(128, 0, 128, 1)">3</span>-<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
docker tag gcr.azk8s.cn</span>/google-containers/coredns:<span style="color: rgba(128, 0, 128, 1)">1.6</span>.<span style="color: rgba(128, 0, 128, 1)">5</span> k8s.gcr.io/coredns:<span style="color: rgba(128, 0, 128, 1)">1.6</span>.<span style="color: rgba(128, 0, 128, 1)">5</span></pre>
</div>
<p>  同样的方式完成所有镜像的下载。</p>
<p>  如果有多台服务器可以进行同样的操作。</p>
<p>&nbsp;</p>
<p>  设置主机域名</p>
<p>  编辑/etc/hostname,将hostname修改为k8s-node1<br>  编辑/etc/hosts,追加内容 IP k8s-node1</p>
<p>&nbsp;</p>
<p>  然后在主节点再次执行初始化,如果失败,可以先执行kubeadm reset</p>
<div class="cnblogs_code">
<pre>kubeadm init --pod-network-cidr=<span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>/<span style="color: rgba(128, 0, 128, 1)">16<br><br>## 如果需要多个节点<br>kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=192.168.56.104<br></span></pre>
</div>
<p>  继续执行</p>
<p>  </p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">mkdir</span> -p $HOME/<span style="color: rgba(0, 0, 0, 1)">.kube
</span><span style="color: rgba(0, 0, 255, 1)">sudo</span> <span style="color: rgba(0, 0, 255, 1)">cp</span> -i /etc/kubernetes/admin.conf $HOME/.kube/<span style="color: rgba(0, 0, 0, 1)">config
</span><span style="color: rgba(0, 0, 255, 1)">sudo</span> <span style="color: rgba(0, 0, 255, 1)">chown</span> $(<span style="color: rgba(0, 0, 255, 1)">id</span> -u):$(<span style="color: rgba(0, 0, 255, 1)">id</span> -g) $HOME/.kube/config</pre>
</div>
<p>  安装Calico</p>
<div class="cnblogs_code">
<pre>kubectl apply -f https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">docs.projectcalico.org/v3.11/manifests/calico.yaml</span></pre>
</div>
<p>  这一步也需要下载相应的calico镜像,也可能下载失败,大家可以去上面的yaml文件中,找到需要的镜像,然后搜索下载方式,这里就不说了。</p>
<p>  验证是否成功</p>
<p>  </p>
<div class="cnblogs_code">
<pre>watch kubectl get pods --all-namespaces</pre>
</div>
<p>  结果如下就表示成功了</p>
<p>  </p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">NAMESPACE    NAME                                       READYSTATUS   RESTARTSAGE
kube</span>-systemcalico-kube-controllers-6ff88bf6d4-tgtzb   <span style="color: rgba(128, 0, 128, 1)">1</span>/<span style="color: rgba(128, 0, 128, 1)">1</span>    Running<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">         2m45s
kube</span>-systemcalico-node-24h85                        <span style="color: rgba(128, 0, 128, 1)">1</span>/<span style="color: rgba(128, 0, 128, 1)">1</span>    Running<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">         2m43s
kube</span>-systemcoredns-846jhw23g9-9af73                   <span style="color: rgba(128, 0, 128, 1)">1</span>/<span style="color: rgba(128, 0, 128, 1)">1</span>    Running<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">         4m5s
kube</span>-systemcoredns-846jhw23g9-hmswk                   <span style="color: rgba(128, 0, 128, 1)">1</span>/<span style="color: rgba(128, 0, 128, 1)">1</span>    Running<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">         4m5s
kube</span>-systemetcd-jbaker-<span style="color: rgba(128, 0, 128, 1)">1</span>                              <span style="color: rgba(128, 0, 128, 1)">1</span>/<span style="color: rgba(128, 0, 128, 1)">1</span>    Running<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">         6m22s
kube</span>-systemkube-apiserver-jbaker-<span style="color: rgba(128, 0, 128, 1)">1</span>                  <span style="color: rgba(128, 0, 128, 1)">1</span>/<span style="color: rgba(128, 0, 128, 1)">1</span>    Running<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">         6m12s
kube</span>-systemkube-controller-manager-jbaker-<span style="color: rgba(128, 0, 128, 1)">1</span>         <span style="color: rgba(128, 0, 128, 1)">1</span>/<span style="color: rgba(128, 0, 128, 1)">1</span>    Running<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">         6m16s
kube</span>-systemkube-proxy-8fzp2                           <span style="color: rgba(128, 0, 128, 1)">1</span>/<span style="color: rgba(128, 0, 128, 1)">1</span>    Running<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">         5m16s
kube</span>-systemkube-scheduler-jbaker-<span style="color: rgba(128, 0, 128, 1)">1</span>                  <span style="color: rgba(128, 0, 128, 1)">1</span>/<span style="color: rgba(128, 0, 128, 1)">1</span>    Running<span style="color: rgba(128, 0, 128, 1)">0</span>         5m41s</pre>
</div>
<p>  如果calico-node出现ErrorImagePull等状态,就表示这个镜像没有下载成功,需要自己手动去国内镜像地址去下载,名称和版本号见https://docs.projectcalico.org/v3.11/manifests/calico.yaml</p>
<p>  配置master节点为work节点</p>
<div class="cnblogs_code">
<pre>kubectl taint nodes --all node-role.kubernetes.io/master-</pre>
</div>
<p>  结果如下</p>
<div class="cnblogs_code">
<pre>node/&lt;your-<span style="color: rgba(0, 0, 255, 1)">hostname</span>&gt; untainted</pre>
</div>
<p>  最后运行</p>
<p>  </p>
<div class="cnblogs_code">
<pre>kubectl get nodes -o wide</pre>
</div>
<p>  出现类型如下结果就表示成功了</p>
<div class="cnblogs_code">
<pre>NAME            STATUS   ROLES    AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION    CONTAINER-<span style="color: rgba(0, 0, 0, 1)">RUNTIME
</span>&lt;your-<span style="color: rgba(0, 0, 255, 1)">hostname</span>&gt;   Ready    master   52m   v1.<span style="color: rgba(128, 0, 128, 1)">12.2</span>   <span style="color: rgba(128, 0, 128, 1)">10.128</span>.<span style="color: rgba(128, 0, 128, 1)">0.28</span>   &lt;none&gt;      Ubuntu <span style="color: rgba(128, 0, 128, 1)">18.04</span>.<span style="color: rgba(128, 0, 128, 1)">1</span> LTS   <span style="color: rgba(128, 0, 128, 1)">4.15</span>.<span style="color: rgba(128, 0, 128, 1)">0</span>-<span style="color: rgba(128, 0, 128, 1)">1023</span>-gcp   docker:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">18.6.1</span></pre>
</div>
<p>&nbsp;</p>
<p>  </p><br><br>
来源:https://www.cnblogs.com/lilinwei340/p/12099217.html
頁: [1]
查看完整版本: 学习kubernetes——搭建kubernetes集群