ubuntu 使用阿里云镜像源快速搭建kubernetes 1.15.2集群
<h1>一、概述</h1><p>搭建k8s集群时,需要访问google,下载相关镜像以及安装软件,非常麻烦。</p>
<p>正好阿里云提供了k8s的更新源,国内用户就可以直接使用了。</p>
<p> </p>
<h1>二、环境介绍</h1>
<table border="0" align="left">
<tbody>
<tr>
<td>操作系统</td>
<td>主机名</td>
<td>IP地址</td>
<td>功能</td>
<td>配置</td>
</tr>
<tr>
<td>ubuntu-16.04.5-server-amd64</td>
<td>k8s-master</td>
<td>192.168.10.130</td>
<td>主节点</td>
<td>2核4G</td>
</tr>
<tr>
<td>ubuntu-16.04.5-server-amd64</td>
<td>k8s-node1</td>
<td>192.168.10.131</td>
<td>从节点</td>
<td>2核4G</td>
</tr>
<tr>
<td>ubuntu-16.04.5-server-amd64</td>
<td>k8s-node2</td>
<td>192.168.10.132</td>
<td>从节点</td>
<td>2核4G</td>
</tr>
</tbody>
</table>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p><span style="color: rgba(255, 0, 0, 1)"><strong> 注意:请确保CPU至少2核,内存2G</strong></span></p>
<h1>三、安装前准备</h1>
<h2>主机名</h2>
<p>确保3台主机的 <span style="color: rgba(255, 0, 0, 1)">/etc/hostname</span> 已经修改为正确的主机名,修改后,请重启系统。</p>
<p> </p>
<h2>时间</h2>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>务必保证3台服务器的时区是一样的</strong></span>,强制更改时区为上海,执行以下命令</p>
<div class="cnblogs_code">
<pre>ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
bash -c "echo 'Asia/Shanghai' > /etc/timezone"</pre>
</div>
<p> </p>
<p>安装ntpdate</p>
<div class="cnblogs_code">
<pre>apt-get install -y ntpdate</pre>
</div>
<p>如果出现以下错误</p>
<div class="cnblogs_code">
<pre>E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?</pre>
</div>
<p>执行2个命令解决</p>
<div class="cnblogs_code">
<pre>sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock</pre>
</div>
<p> </p>
<p>使用阿里云的时间服务器更新</p>
<div class="cnblogs_code">
<pre>ntpdate ntp1.aliyun.com</pre>
</div>
<p>3台服务器都执行一下,<strong>确保时间一致!</strong></p>
<p>请确保防火墙都关闭了!</p>
<p> </p>
<h1>四、正式开始</h1>
<h2>禁用swap</h2>
<p><strong><span style="color: rgba(255, 0, 0, 1)">所有主机</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">sudo</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)">/swap/ s/^/#/</span><span style="color: rgba(128, 0, 0, 1)">'</span> /etc/<span style="color: rgba(0, 0, 0, 1)">fstab
</span><span style="color: rgba(0, 0, 255, 1)">sudo</span> swapoff -a</pre>
</div>
<p> </p>
<h2>安装Docker</h2>
<p>更新apt源,并添加https支持<span style="color: rgba(255, 0, 0, 1)"><strong>(所有主机)</strong></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">sudo</span> apt-get update && <span style="color: rgba(0, 0, 255, 1)">sudo</span> apt-get <span style="color: rgba(0, 0, 255, 1)">install</span> apt-transport-https ca-certificates curl software-properties-common -y</pre>
</div>
<p> </p>
<p>使用utc源添加GPG Key<span style="color: rgba(255, 0, 0, 1)"><strong> (所有主机)</strong></span></p>
<div class="cnblogs_code">
<pre>curl -fsSL https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add </span></pre>
</div>
<p> </p>
<p>添加Docker-ce稳定版源地址<strong><span style="color: rgba(255, 0, 0, 1)">(所有主机)</span></strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">sudo</span> add-apt-repository <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">deb https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p> </p>
<p>安装docker-ce<strong><span style="color: rgba(255, 0, 0, 1)">(所有主机)</span></strong></p>
<p><span style="color: rgba(0, 0, 0, 1)">安装最新版docker</span></p>
<p> </p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">sudo</span> apt-<span style="color: rgba(0, 0, 0, 1)">get update
</span><span style="color: rgba(0, 0, 255, 1)">sudo</span> apt-get <span style="color: rgba(0, 0, 255, 1)">install</span> -y docker-ce=<span style="color: rgba(128, 0, 128, 1)">5</span>:<span style="color: rgba(128, 0, 128, 1)">19.03</span>.<span style="color: rgba(128, 0, 128, 1)">1</span>~<span style="color: rgba(128, 0, 128, 1)">3</span>-<span style="color: rgba(128, 0, 128, 1)">0</span>~ubuntu-xenial</pre>
</div>
<p> </p>
<p> </p>
<p> </p>
<h2>安装kubelet,kubeadm,kubectl</h2>
<p>添加apt key以及源<span style="color: rgba(255, 0, 0, 1)"><strong>(所有主机)</strong></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">sudo</span> apt update && <span style="color: rgba(0, 0, 255, 1)">sudo</span> apt <span style="color: rgba(0, 0, 255, 1)">install</span> -y apt-transport-<span style="color: rgba(0, 0, 0, 1)">https curl
curl </span>-s https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -</span>
<span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main</span><span style="color: rgba(128, 0, 0, 1)">"</span> >>/etc/apt/sources.list.d/kubernetes.list</pre>
</div>
<p> </p>
<p>安装<span style="color: rgba(255, 0, 0, 1)"><strong>(所有主机)</strong></span></p>
<p><span style="color: rgba(0, 0, 0, 1)">最新版kubelet</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">sudo</span><span style="color: rgba(0, 0, 0, 1)"> apt update
</span><span style="color: rgba(0, 0, 255, 1)">sudo</span> apt <span style="color: rgba(0, 0, 255, 1)">install</span> -y kubelet=<span style="color: rgba(128, 0, 128, 1)">1.15</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">00</span> kubeadm=<span style="color: rgba(128, 0, 128, 1)">1.15</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">00</span> kubectl=<span style="color: rgba(128, 0, 128, 1)">1.15</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">00</span>
<span style="color: rgba(0, 0, 255, 1)">sudo</span> apt-mark hold kubelet=<span style="color: rgba(128, 0, 128, 1)">1.15</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">00</span> kubeadm=<span style="color: rgba(128, 0, 128, 1)">1.15</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">00</span> kubectl=<span style="color: rgba(128, 0, 128, 1)">1.15</span>.<span style="color: rgba(128, 0, 128, 1)">2</span>-<span style="color: rgba(128, 0, 128, 1)">00</span></pre>
</div>
<p> </p>
<p>安装kubernetes集群<span style="color: rgba(255, 0, 0, 1)"><strong>(仅master)</strong></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">sudo</span> kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.<span style="color: rgba(128, 0, 128, 1)">15.2</span> --pod-network-cidr=<span style="color: rgba(128, 0, 128, 1)">192.169</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>/<span style="color: rgba(128, 0, 128, 1)">16 | tee /etc/kube-server-key</span></pre>
</div>
<p>参数解释:</p>
<p><span style="color: rgba(255, 0, 0, 1)">--image-repository</span> 指定镜像源,指定为阿里云的源,这样就会避免在拉取镜像超时,如果没问题,过几分钟就能看到成功的日志输入</p>
<p><span style="color: rgba(255, 0, 0, 1)">--kubernetes-version</span> 指定版本</p>
<p><span style="color: rgba(255, 0, 0, 1)">--pod-network-cidr</span> 指定pod网络地址。设置为内网网段!</p>
<p> </p>
<p>三大内网网络为:</p>
<p>C类:192.168.0.0-192.168.255.255<br>B类:172.16.0.0-172.31.255.255<br>A类:10.0.0.0-10.255.255.255</p>
<p> </p>
<p>输出:</p>
<div class="cnblogs_code"><img id="code_img_closed_327025a7-4298-4230-be6f-b04ab24beb16" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_327025a7-4298-4230-be6f-b04ab24beb16" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_327025a7-4298-4230-be6f-b04ab24beb16" class="cnblogs_code_hide">
<pre> Using Kubernetes version: v1.<span style="color: rgba(128, 0, 128, 1)">15.2</span><span style="color: rgba(0, 0, 0, 1)">
Running pre</span>-<span style="color: rgba(0, 0, 0, 1)">flight checks
: detected </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">cgroupfs</span><span style="color: rgba(128, 0, 0, 1)">"</span> as the Docker cgroup driver. The recommended driver is <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">systemd</span><span style="color: rgba(128, 0, 0, 1)">"</span>. Please follow the guide at https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">kubernetes.io/docs/setup/cri/</span>
: this Docker version is not on the list of validated versions: <span style="color: rgba(128, 0, 128, 1)">19.03</span>.<span style="color: rgba(128, 0, 128, 1)">1</span>. Latest validated version: <span style="color: rgba(128, 0, 128, 1)">18.09</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 this action </span><span style="color: rgba(0, 0, 255, 1)">in</span> beforehand using <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)">
Writing kubelet environment <span style="color: rgba(0, 0, 255, 1)">file</span> with flags to <span style="color: rgba(0, 0, 255, 1)">file</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/var/lib/kubelet/kubeadm-flags.env</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
Writing kubelet configuration to <span style="color: rgba(0, 0, 255, 1)">file</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/var/lib/kubelet/config.yaml</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
Activating the kubelet service
Using certificateDir folder </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/etc/kubernetes/pki</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
Generating </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ca</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> certificate and key
Generating </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">apiserver</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> certificate and key
apiserver serving cert is signed </span><span style="color: rgba(0, 0, 255, 1)">for</span> DNS names and IPs [<span style="color: rgba(128, 0, 128, 1)">10.96</span>.<span style="color: rgba(128, 0, 128, 1)">0.1</span> <span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">10.130</span><span style="color: rgba(0, 0, 0, 1)">]
Generating </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">apiserver-kubelet-client</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> certificate and key
Generating </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">front-proxy-ca</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> certificate and key
Generating </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">front-proxy-client</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> certificate and key
Generating </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">etcd/ca</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> certificate and key
Generating </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">etcd/peer</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> certificate and key
etcd</span>/peer serving cert is signed <span style="color: rgba(0, 0, 255, 1)">for</span> DNS names and IPs [<span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">10.130</span> <span style="color: rgba(128, 0, 128, 1)">127.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.1</span> ::<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">]
Generating </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">etcd/healthcheck-client</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> certificate and key
Generating </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">etcd/server</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> certificate and key
etcd</span>/server serving cert is signed <span style="color: rgba(0, 0, 255, 1)">for</span> DNS names and IPs [<span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">10.130</span> <span style="color: rgba(128, 0, 128, 1)">127.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.1</span> ::<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">]
Generating </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">apiserver-etcd-client</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> certificate and key
Generating </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">sa</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> key and public key
Using kubeconfig folder </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/etc/kubernetes</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
Writing </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">admin.conf</span><span style="color: rgba(128, 0, 0, 1)">"</span> kubeconfig <span style="color: rgba(0, 0, 255, 1)">file</span><span style="color: rgba(0, 0, 0, 1)">
Writing </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubelet.conf</span><span style="color: rgba(128, 0, 0, 1)">"</span> kubeconfig <span style="color: rgba(0, 0, 255, 1)">file</span><span style="color: rgba(0, 0, 0, 1)">
Writing </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">controller-manager.conf</span><span style="color: rgba(128, 0, 0, 1)">"</span> kubeconfig <span style="color: rgba(0, 0, 255, 1)">file</span><span style="color: rgba(0, 0, 0, 1)">
Writing </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">scheduler.conf</span><span style="color: rgba(128, 0, 0, 1)">"</span> kubeconfig <span style="color: rgba(0, 0, 255, 1)">file</span><span style="color: rgba(0, 0, 0, 1)">
Using manifest folder <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/etc/kubernetes/manifests</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
Creating static Pod manifest <span style="color: rgba(0, 0, 255, 1)">for</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kube-apiserver</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
Creating static Pod manifest <span style="color: rgba(0, 0, 255, 1)">for</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kube-controller-manager</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
Creating static Pod manifest <span style="color: rgba(0, 0, 255, 1)">for</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kube-scheduler</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
Creating static Pod manifest </span><span style="color: rgba(0, 0, 255, 1)">for</span> local etcd <span style="color: rgba(0, 0, 255, 1)">in</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/etc/kubernetes/manifests</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
[</span><span style="color: rgba(0, 0, 255, 1)">wait</span>-control-plane] Waiting <span style="color: rgba(0, 0, 255, 1)">for</span> the kubelet to boot up the control plane as static Pods from directory <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/etc/kubernetes/manifests</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">. This can take up to 4m0s
Initial timeout of 40s passed.
All control plane components are healthy after </span><span style="color: rgba(128, 0, 128, 1)">41.507944</span><span style="color: rgba(0, 0, 0, 1)"> seconds
Storing the configuration used <span style="color: rgba(0, 0, 255, 1)">in</span> ConfigMap <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubeadm-config</span><span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(0, 0, 255, 1)">in</span> the <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kube-system</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> Namespace
Creating a ConfigMap </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubelet-config-1.15</span><span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(0, 0, 255, 1)">in</span> namespace kube-system with the configuration <span style="color: rgba(0, 0, 255, 1)">for</span> the kubelets <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> the cluster
Skipping phase. Please see --upload-<span style="color: rgba(0, 0, 0, 1)">certs
Marking the node k8s-master as control-plane by adding the label <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">node-role.kubernetes.io/master=''</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
Marking the node k8s-master as control-plane by adding the taints
Using token: bz16uu.olqxoh5q5bnt50sd
Configuring bootstrap tokens, cluster-<span style="color: rgba(0, 0, 255, 1)">info</span><span style="color: rgba(0, 0, 0, 1)"> ConfigMap, RBAC Roles
configured RBAC rules to allow Node Bootstrap tokens to post CSRs <span style="color: rgba(0, 0, 255, 1)">in</span> order <span style="color: rgba(0, 0, 255, 1)">for</span> nodes to get <span style="color: rgba(0, 0, 255, 1)">long</span><span style="color: rgba(0, 0, 0, 1)"> term certificate credentials
configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
configured RBAC rules to allow certificate rotation <span style="color: rgba(0, 0, 255, 1)">for</span> all node client certificates <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> the cluster
Creating the <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">cluster-info</span><span style="color: rgba(128, 0, 0, 1)">"</span> ConfigMap <span style="color: rgba(0, 0, 255, 1)">in</span> the <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kube-public</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> namespace
Applied essential addon: CoreDNS
Applied essential addon: kube</span>-<span style="color: rgba(0, 0, 0, 1)">proxy
Your Kubernetes control</span>-plane has initialized successfully!<span style="color: rgba(0, 0, 0, 1)">
To start using your cluster, you need to run the following as a regular user:
</span><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/<span style="color: rgba(0, 0, 0, 1)">config
You should now deploy a pod network to the cluster.
Run </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubectl apply -f .yaml</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> with one of the options listed at:
https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">kubernetes.io/docs/concepts/cluster-administration/addons/</span>
<span style="color: rgba(0, 0, 0, 1)">
Then you can </span><span style="color: rgba(0, 0, 255, 1)">join</span><span style="color: rgba(0, 0, 0, 1)"> any number of worker nodes by running the following on each as root:
kubeadm </span><span style="color: rgba(0, 0, 255, 1)">join</span> <span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">10.130</span>:<span style="color: rgba(128, 0, 128, 1)">6443</span> --<span style="color: rgba(0, 0, 0, 1)">token bz16uu.olqxoh5q5bnt50sd \
</span>--discovery-token-ca-cert-hash sha256:9177017ff3016dbb2aadf7484f7823f8b963c989fe9ecdccbe601c9305ce000f</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>出现WARNING信息,可以忽略。</p>
<p>输出信息,会保存到 <span style="color: rgba(255, 0, 0, 1)">/etc/kube-server-key</span> 文件中</p>
<p> </p>
<p>拷贝kubeconfig文件到家目录的.kube目录 <span style="color: rgba(255, 0, 0, 1)"><strong>(仅master)</strong></span></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> </p>
<p>安装网络插件,让pod之间通信<span style="color: rgba(255, 0, 0, 1)"><strong>(仅master)</strong></span></p>
<p><span style="color: rgba(0, 0, 0, 1)">使用最新版的</span></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.8/manifests/calico.yaml</span></pre>
</div>
<p> </p>
<p>查看kube-system命名空间下的pod状态<span style="color: rgba(255, 0, 0, 1)"><strong>(仅master)</strong></span></p>
<div class="cnblogs_code">
<pre>kubectl get pod -n kube-system</pre>
</div>
<p> </p>
<p>等待1分钟,效果如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">NAME READY STATUS RESTARTS AGE
calico</span>-kube-controllers-7bd78b474d-lpfvf <span style="color: rgba(128, 0, 128, 1)">0</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)"> 67s
calico</span>-node-vfm28 <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)"> 67s
coredns</span>-bccdc95cf-dm4pb <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)"> 111s
coredns</span>-bccdc95cf-lvhcg <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)"> 111s
etcd</span>-k8s-master <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)"> 69s
kube</span>-apiserver-k8s-master <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)"> 67s
kube</span>-controller-manager-k8s-master <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)"> 59s
kube</span>-proxy-jpqsq <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)"> 111s
kube</span>-scheduler-k8s-master <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> 56s</pre>
</div>
<p> </p>
<p>查看加入节点命令<span style="color: rgba(255, 0, 0, 1)"><strong>(仅master)</strong></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">cat</span> /etc/kube-server-key | <span style="color: rgba(0, 0, 255, 1)">tail</span> -<span style="color: rgba(128, 0, 128, 1)">2</span></pre>
</div>
<p>输出:</p>
<div class="cnblogs_code">
<pre>kubeadm <span style="color: rgba(0, 0, 255, 1)">join</span> <span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">10.130</span>:<span style="color: rgba(128, 0, 128, 1)">6443</span> --<span style="color: rgba(0, 0, 0, 1)">token bz16uu.olqxoh5q5bnt50sd \
</span>--discovery-token-ca-cert-hash sha256:9177017ff3016dbb2aadf7484f7823f8b963c989fe9ecdccbe601c9305ce000f</pre>
</div>
<p> </p>
<p>加入node节点 <span style="color: rgba(255, 0, 0, 1)"><strong>(仅node)</strong></span></p>
<p>在每个node上执行</p>
<div class="cnblogs_code">
<pre>kubeadm <span style="color: rgba(0, 0, 255, 1)">join</span> <span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">10.130</span>:<span style="color: rgba(128, 0, 128, 1)">6443</span> --<span style="color: rgba(0, 0, 0, 1)">token bz16uu.olqxoh5q5bnt50sd \
</span>--discovery-token-ca-cert-hash sha256:9177017ff3016dbb2aadf7484f7823f8b963c989fe9ecdccbe601c9305ce000f</pre>
</div>
<p> </p>
<p>等待5分钟,查看集群状态<span style="color: rgba(255, 0, 0, 1)"><strong>(仅master)</strong></span></p>
<div class="cnblogs_code">
<pre>root@k8s-master:~<span style="color: rgba(0, 0, 0, 1)"># <span style="color: rgba(255, 0, 0, 1)">kubectl get nodes</span>
NAME STATUS ROLES AGE VERSION
k8s</span>-master Ready master 5m54s v1.<span style="color: rgba(128, 0, 128, 1)">15.2</span><span style="color: rgba(0, 0, 0, 1)">
k8s</span>-node1 Ready <none> 73s v1.<span style="color: rgba(128, 0, 128, 1)">15.2</span><span style="color: rgba(0, 0, 0, 1)">
k8s</span>-node2 Ready <none> 71s v1.<span style="color: rgba(128, 0, 128, 1)">15.2</span></pre>
</div>
<p> </p>
<h2>命令补全</h2>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>(仅master)</strong></span></p>
<div class="cnblogs_code">
<pre>apt-get <span style="color: rgba(0, 0, 255, 1)">install</span> bash-<span style="color: rgba(0, 0, 0, 1)">completion
source </span><<span style="color: rgba(0, 0, 0, 1)">(kubectl completion bash)
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">source <(kubectl completion bash)</span><span style="color: rgba(128, 0, 0, 1)">"</span> >> ~/<span style="color: rgba(0, 0, 0, 1)">.bashrc
source</span>~/.bashrc</pre>
</div>
<p> </p>
<h1>四、部署应用</h1>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>(仅master)</strong></span></p>
<p>这里以flask为例:</p>
<div class="cnblogs_code">
<pre>vim flask.yaml</pre>
</div>
<p>内容如下:</p>
<div class="cnblogs_code">
<pre>apiVersion: extensions/<span style="color: rgba(0, 0, 0, 1)">v1beta1
kind: Deployment
metadata:
name: flaskapp</span>-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
spec:
replicas: </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
template:
metadata:
labels:
name: flaskapp</span>-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
spec:
containers:
</span>- name: flaskapp-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
image: jcdemo</span>/<span style="color: rgba(0, 0, 0, 1)">flaskapp
ports:
</span>- containerPort: <span style="color: rgba(128, 0, 128, 1)">5000</span>
---<span style="color: rgba(0, 0, 0, 1)">
apiVersion: v1
kind: Service
metadata:
name: flaskapp</span>-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
labels:
name: flaskapp</span>-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
spec:
type: NodePort
ports:
</span>- port: <span style="color: rgba(128, 0, 128, 1)">5000</span><span style="color: rgba(0, 0, 0, 1)">
name: flaskapp</span>-<span style="color: rgba(0, 0, 0, 1)">port
targetPort: </span><span style="color: rgba(128, 0, 128, 1)">5000</span><span style="color: rgba(0, 0, 0, 1)">
protocol: TCP
nodePort: </span><span style="color: rgba(128, 0, 128, 1)">30005</span><span style="color: rgba(0, 0, 0, 1)">
selector:
name: flaskapp</span>-<span style="color: rgba(128, 0, 128, 1)">1</span></pre>
</div>
<p> </p>
<h2>启动应用</h2>
<div class="cnblogs_code">
<pre>kubectl apply -f flask.yaml</pre>
</div>
<p> </p>
<p>查看应用状态</p>
<div class="cnblogs_code">
<pre>root@k8s-master:~# kubectl get pods -<span style="color: rgba(0, 0, 0, 1)">o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
flaskapp</span>-<span style="color: rgba(128, 0, 128, 1)">1</span>-59698bc97d-2xnhb <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> 24s <span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">36.65</span> k8s-node1 <none> <none></pre>
</div>
<p>以上信息可以说明,这个pod运行在k8s-node1这台主机上面</p>
<p> </p>
<p>ping pod ip地址,如果可以ping通,说明calico插件运行正常。</p>
<div class="cnblogs_code">
<pre>root@k8s-master:~# <span style="color: rgba(255, 0, 0, 1)">ping 192.168.36.65 -c 1</span><span style="color: rgba(0, 0, 0, 1)">
PING </span><span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">36.65</span> (<span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">36.65</span>) <span style="color: rgba(128, 0, 128, 1)">56</span>(<span style="color: rgba(128, 0, 128, 1)">84</span><span style="color: rgba(0, 0, 0, 1)">) bytes of data.
</span><span style="color: rgba(128, 0, 128, 1)">64</span> bytes from <span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">36.65</span>: icmp_seq=<span style="color: rgba(128, 0, 128, 1)">1</span> ttl=<span style="color: rgba(128, 0, 128, 1)">63</span> <span style="color: rgba(0, 0, 255, 1)">time</span>=<span style="color: rgba(128, 0, 128, 1)">6.77</span><span style="color: rgba(0, 0, 0, 1)"> ms
</span>--- <span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">36.65</span> <span style="color: rgba(0, 0, 255, 1)">ping</span> statistics ---
<span style="color: rgba(128, 0, 128, 1)">1</span> packets transmitted, <span style="color: rgba(128, 0, 128, 1)">1</span> received, <span style="color: rgba(128, 0, 128, 1)">0</span>% packet loss, <span style="color: rgba(0, 0, 255, 1)">time</span><span style="color: rgba(0, 0, 0, 1)"> 0ms
rtt min</span>/avg/max/mdev = <span style="color: rgba(128, 0, 128, 1)">6.777</span>/<span style="color: rgba(128, 0, 128, 1)">6.777</span>/<span style="color: rgba(128, 0, 128, 1)">6.777</span>/<span style="color: rgba(128, 0, 128, 1)">0.000</span> ms</pre>
</div>
<p> </p>
<p>测试 pod 是否可以上网</p>
<div class="cnblogs_code">
<pre>root@k8s-master:~# <span style="color: rgba(255, 0, 0, 1)">kubectl exec -it flaskapp-1-59698bc97d-2xnhb -- ping www.baidu.com -c 1</span><span style="color: rgba(0, 0, 0, 1)">
PING www.baidu.com (</span><span style="color: rgba(128, 0, 128, 1)">61.135</span>.<span style="color: rgba(128, 0, 128, 1)">169.125</span>): <span style="color: rgba(128, 0, 128, 1)">56</span><span style="color: rgba(0, 0, 0, 1)"> data bytes
</span><span style="color: rgba(128, 0, 128, 1)">64</span> bytes from <span style="color: rgba(128, 0, 128, 1)">61.135</span>.<span style="color: rgba(128, 0, 128, 1)">169.125</span>: <span style="color: rgba(0, 0, 255, 1)">seq</span>=<span style="color: rgba(128, 0, 128, 1)">0</span> ttl=<span style="color: rgba(128, 0, 128, 1)">53</span> <span style="color: rgba(0, 0, 255, 1)">time</span>=<span style="color: rgba(128, 0, 128, 1)">27.079</span><span style="color: rgba(0, 0, 0, 1)"> ms
</span>--- www.baidu.com <span style="color: rgba(0, 0, 255, 1)">ping</span> statistics ---
<span style="color: rgba(128, 0, 128, 1)">1</span> packets transmitted, <span style="color: rgba(128, 0, 128, 1)">1</span> packets received, <span style="color: rgba(128, 0, 128, 1)">0</span>%<span style="color: rgba(0, 0, 0, 1)"> packet loss
round</span>-trip min/avg/max = <span style="color: rgba(128, 0, 128, 1)">27.079</span>/<span style="color: rgba(128, 0, 128, 1)">27.079</span>/<span style="color: rgba(128, 0, 128, 1)">27.079</span> ms</pre>
</div>
<p> </p>
<p>使用curl访问pod ip的服务</p>
<div class="cnblogs_code">
<pre>root@k8s-master:~# <span style="color: rgba(255, 0, 0, 1)">curl 192.168.36.65:5000</span>
<html><<span style="color: rgba(0, 0, 255, 1)">head</span>><title>Docker + Flask Demo</title></<span style="color: rgba(0, 0, 255, 1)">head</span>><body><table><<span style="color: rgba(0, 0, 255, 1)">tr</span>><td> Start Time </td> <td><span style="color: rgba(128, 0, 128, 1)">2019</span>-Aug-<span style="color: rgba(128, 0, 128, 1)">11</span> <span style="color: rgba(128, 0, 128, 1)">04</span>:<span style="color: rgba(128, 0, 128, 1)">52</span>:<span style="color: rgba(128, 0, 128, 1)">17</span></td> </<span style="color: rgba(0, 0, 255, 1)">tr</span>><<span style="color: rgba(0, 0, 255, 1)">tr</span>><td> Hostname </td> <td>flaskapp-<span style="color: rgba(128, 0, 128, 1)">1</span>-59698bc97d-2xnhb</td> </<span style="color: rgba(0, 0, 255, 1)">tr</span>><<span style="color: rgba(0, 0, 255, 1)">tr</span>><td> Local Address </td> <td><span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">36.65</span></td> </<span style="color: rgba(0, 0, 255, 1)">tr</span>><<span style="color: rgba(0, 0, 255, 1)">tr</span>><td> Remote Address </td> <td><span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">235.192</span></td> </<span style="color: rgba(0, 0, 255, 1)">tr</span>><<span style="color: rgba(0, 0, 255, 1)">tr</span>><td> Server Hit </td> <td><span style="color: rgba(128, 0, 128, 1)">1</span></td> </<span style="color: rgba(0, 0, 255, 1)">tr</span>></table></body></html></pre>
</div>
<p> </p>
<p>查看svc端口</p>
<div class="cnblogs_code">
<pre>root@k8s-master:~<span style="color: rgba(0, 0, 0, 1)"># kubectl get svc
NAME TYPE CLUSTER</span>-IP EXTERNAL-<span style="color: rgba(0, 0, 0, 1)">IP PORT(S) AGE
flaskapp</span>-<span style="color: rgba(128, 0, 128, 1)">1</span> NodePort <span style="color: rgba(128, 0, 128, 1)">10.107</span>.<span style="color: rgba(128, 0, 128, 1)">181.43</span> <none> <span style="color: rgba(128, 0, 128, 1)">5000</span>:<span style="color: rgba(128, 0, 128, 1)">30005</span>/<span style="color: rgba(0, 0, 0, 1)">TCP 3m40s
kubernetes ClusterIP </span><span style="color: rgba(128, 0, 128, 1)">10.96</span>.<span style="color: rgba(128, 0, 128, 1)">0.1</span> <none> <span style="color: rgba(128, 0, 128, 1)">443</span>/TCP 10m</pre>
</div>
<p> </p>
<p>直接网页访问k8s-node1的30005端口</p>
<div class="cnblogs_code">
<pre>http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">192.168.10.131:30005/</span></pre>
</div>
<p> </p>
<p>效果如下:</p>
<p><img src="https://img2018.cnblogs.com/blog/1341090/201908/1341090-20190811125721617-1361852690.png" alt=""></p>
<p> </p>
<h1 class="title-article">五、部署dashboard可视化插件</h1>
<h2>概述</h2>
<p>在 Kubernetes Dashboard 中可以查看集群中应用的运行状态,也能够创建和修改各种 Kubernetes 资源,比如 Deployment、Job、DaemonSet 等。用户可以 Scale Up/Down Deployment、执行 Rolling Update、重启某个 Pod 或者通过向导部署新的应用。Dashboard 能显示集群中各种资源的状态以及日志信息。</p>
<p> </p>
<p>可以说,Kubernetes Dashboard 提供了 kubectl 的绝大部分功能,大家可以根据情况进行选择。</p>
<p>github地址:</p>
<p>https://github.com/kubernetes/dashboard</p>
<p> </p>
<h2>安装</h2>
<p>Kubernetes 默认没有部署 Dashboard,可通过如下命令安装:</p>
<div class="cnblogs_code">
<pre>kubectl apply -f http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">mirror.faasx.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml</span></pre>
</div>
<p> </p>
<h2>查看service</h2>
<div class="cnblogs_code">
<pre>root@k8s-master:~# <span style="color: rgba(255, 0, 0, 1)">kubectl --namespace=kube-system get deployment kubernetes-</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">dashboard</span>
NAME READY UP</span>-TO-<span style="color: rgba(0, 0, 0, 1)">DATE AVAILABLE AGE
kubernetes</span>-dashboard <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> <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)"> 5m23s
root@k8s</span>-master:~# <span style="color: rgba(255, 0, 0, 1)">kubectl --namespace=kube-system get service kubernetes-</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">dashboard</span>
NAME TYPE CLUSTER</span>-IP EXTERNAL-<span style="color: rgba(0, 0, 0, 1)">IP PORT(S) AGE
kubernetes</span>-dashboard ClusterIP <span style="color: rgba(128, 0, 128, 1)">10.100</span>.<span style="color: rgba(128, 0, 128, 1)">111.103</span> <none> <span style="color: rgba(128, 0, 128, 1)">443</span>/TCP 5m28s</pre>
</div>
<p> </p>
<h2>查看pod</h2>
<p>确保状态是Running </p>
<div class="cnblogs_code">
<pre>root@k8s-master:~# <span style="color: rgba(255, 0, 0, 1)">kubectl get pod --namespace=kube-system -o wide | grep</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"> dashboard</span>
kubernetes</span>-dashboard-8594bd9565-t78bj <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> 8m41s <span style="color: rgba(128, 0, 128, 1)">192.169</span>.<span style="color: rgba(128, 0, 128, 1)">2.7</span> k8s-node2 <none> <none></pre>
</div>
<p> </p>
<h2>允许外部访问</h2>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>注意:会占用终端</strong></span></p>
<div class="cnblogs_code">
<pre>kubectl proxy --address=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0.0.0.0</span><span style="color: rgba(128, 0, 0, 1)">'</span>--accept-hosts=<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)">'</span></pre>
</div>
<p> </p>
<p>配置登录权限</p>
<p>Dashboard 支持 Kubeconfig 和 Token 两种认证方式,为了简化配置,我们通过配置文件 dashboard-admin.yaml 为 Dashboard 默认用户赋予 admin 权限。</p>
<div class="cnblogs_code">
<pre>vim dashboard-admin.yml</pre>
</div>
<p>内容如下:</p>
<div class="cnblogs_code">
<pre>apiVersion: rbac.authorization.k8s.io/<span style="color: rgba(0, 0, 0, 1)">v1beta1
kind: ClusterRoleBinding
metadata:
name: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
labels:
k8s</span>-app: kubernetes-<span style="color: rgba(0, 0, 0, 1)">dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster</span>-<span style="color: rgba(0, 0, 0, 1)">admin
subjects:
</span>-<span style="color: rgba(0, 0, 0, 1)"> kind: ServiceAccount
name: kubernetes</span>-<span style="color: rgba(0, 0, 0, 1)">dashboard
namespace: kube</span>-system</pre>
</div>
<p> </p>
<p>执行kubectl apply使之生效</p>
<div class="cnblogs_code">
<pre>kubectl apply -f dashboard-admin.yml</pre>
</div>
<p> </p>
<h2>通过浏览器访问</h2>
<p>注意:192.168.10.130为master ip</p>
<div class="cnblogs_code">
<pre>http://192.168.10.130:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/.</pre>
</div>
<p> </p>
<p>现在直接点击登录页面的跳过</p>
<p><img src="https://img2018.cnblogs.com/blog/1341090/201908/1341090-20190807220159100-1202168228.png" alt=""></p>
<p> </p>
<p>就可以进入 Dashboard 了,效果如下:</p>
<p><img src="https://img2018.cnblogs.com/blog/1341090/201908/1341090-20190807220211879-1899073531.png" alt=""></p>
<p> </p>
<p> </p>
<p>关于dashboard界面结构介绍,请参考链接:</p>
<p>https://www.cnblogs.com/kenken2018/p/10340157.html</p>
<p> </p>
<h1>六、解决k8s 外网无法访问nodePort问题</h1>
<p>上面flask的例子,无法通过master ip+nodeport访问。</p>
<p>是因为防火墙阻止了</p>
<div class="cnblogs_code">
<pre>root@k8s-master:~# <span style="color: rgba(255, 0, 0, 1)">iptables -xnL|grep</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"> FORWARD</span>
Chain FORWARD (policy DROP)
cali</span>-FORWARDall--<span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>/<span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>/<span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> cali:wUHhoiAYhphO9Mso </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
KUBE</span>-FORWARDall--<span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>/<span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>/<span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> kubernetes forwarding rules </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
Chain KUBE</span>-FORWARD (<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)"> references)
Chain cali</span>-FORWARD (<span style="color: rgba(128, 0, 128, 1)">1</span> references)</pre>
</div>
<p> </p>
<p>解决办法:</p>
<div class="cnblogs_code">
<pre>iptables -P FORWARD ACCEPT</pre>
</div>
<p> </p>
<p>使用master ip+nodeport访问</p>
<div class="cnblogs_code">
<pre>http:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">192.168.10.130:30005/</span></pre>
</div>
<p> </p>
<p>效果如下:</p>
<p><img src="https://img2018.cnblogs.com/blog/1341090/201908/1341090-20190811132201363-2115968013.png" alt=""></p>
<p>参考链接:</p>
<p>https://blog.csdn.net/a610786189/article/details/80321727</p>
<p> </p>
<p> </p>
<p>本文参考链接:</p>
<p>https://www.toutiao.com/i6703112655323791884</p>
<p>https://www.cnblogs.com/busigulang/p/10736040.html</p>
<p>https://www.cnblogs.com/qingfeng2010/p/10540832.html</p>
<p>https://www.cnblogs.com/kenken2018/p/10340157.html</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/xiao987334176/p/11317844.html
頁:
[1]