This commit is contained in:
周伟
2022-05-11 19:04:14 +08:00
parent 9440ac7291
commit d9c5ffd627
826 changed files with 0 additions and 481675 deletions

View File

@@ -25,13 +25,7 @@
<meta name="generator" content="Hexo 4.2.0">
</head>
<body>
<div class="book-container">
<div class="book-sidebar">
@@ -55,325 +49,166 @@
<li><a href="/" class="current-tab">首页</a></li>
</ul>
<ul class="uncollapsible">
<li><a href="../">上一级</a></li>
</ul>
<ul class="uncollapsible">
<li>
<a href="/专栏/Kubernetes 从上手到实践/01 开篇: Kubernetes 是什么以及为什么需要它.md.html">01 开篇: Kubernetes 是什么以及为什么需要它.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/02 初步认识Kubernetes 基础概念.md.html">02 初步认识Kubernetes 基础概念.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/03 宏观认识:整体架构.md.html">03 宏观认识:整体架构.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/04 搭建 Kubernetes 集群 - 本地快速搭建.md.html">04 搭建 Kubernetes 集群 - 本地快速搭建.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/05 动手实践:搭建一个 Kubernetes 集群 - 生产可用.md.html">05 动手实践:搭建一个 Kubernetes 集群 - 生产可用.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/06 集群管理:初识 kubectl.md.html">06 集群管理:初识 kubectl.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/07 集群管理:以 Redis 为例-部署及访问.md.html">07 集群管理:以 Redis 为例-部署及访问.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/08 安全重点 认证和授权.md.html">08 安全重点 认证和授权.md.html</a>
</li>
<li>
<a class="current-tab" href="/专栏/Kubernetes 从上手到实践/09 应用发布:部署实际项目.md.html">09 应用发布:部署实际项目.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/10 应用管理:初识 Helm.md.html">10 应用管理:初识 Helm.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/11 部署实践:以 Helm 部署项目.md.html">11 部署实践:以 Helm 部署项目.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/12 庖丁解牛kube-apiserver.md.html">12 庖丁解牛kube-apiserver.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/13 庖丁解牛etcd.md.html">13 庖丁解牛etcd.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/14 庖丁解牛controller-manager.md.html">14 庖丁解牛controller-manager.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/15 庖丁解牛kube-scheduler.md.html">15 庖丁解牛kube-scheduler.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/16 庖丁解牛kubelet.md.html">16 庖丁解牛kubelet.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/17 庖丁解牛kube-proxy.md.html">17 庖丁解牛kube-proxy.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/18 庖丁解牛Container Runtime Docker.md.html">18 庖丁解牛Container Runtime Docker.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/19 Troubleshoot.md.html">19 Troubleshoot.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/20 扩展增强Dashboard.md.html">20 扩展增强Dashboard.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/21 扩展增强CoreDNS.md.html">21 扩展增强CoreDNS.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/22 服务增强Ingress.md.html">22 服务增强Ingress.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/23 监控实践:对 K8S 集群进行监控.md.html">23 监控实践:对 K8S 集群进行监控.md.html</a>
</li>
<li>
<a href="/专栏/Kubernetes 从上手到实践/24 总结.md.html">24 总结.md.html</a>
</li>
</ul>
</div>
</div>
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
<div class="sidebar-toggle-inner"></div>
</div>
<script>
function add_inner() {
@@ -383,9 +218,6 @@
inner.classList.add('show')
}
function remove_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
@@ -393,9 +225,6 @@
inner.classList.remove('show')
}
function sidebar_toggle() {
let sidebar_toggle = document.querySelector('.sidebar-toggle')
@@ -425,9 +254,6 @@
}
function open_sidebar() {
let sidebar = document.querySelector('.book-sidebar')
@@ -451,13 +277,7 @@ function hide_canvas() {
overlay.classList.remove('show')
}
</script>
<div class="off-canvas-content">
<div class="columns">
@@ -513,31 +333,16 @@ function hide_canvas() {
<p>我们使用了前端框架 <a href="https://vuejs.org/">Vue</a>,所以在做生产部署时,需要先在 <a href="https://nodejs.org/">Node JS</a> 的环境下进行打包构建。包管理器使用的是 <a href="https://yarnpkg.com/">Yarn</a>。然后使用 <a href="https://nginx.com/">Nginx</a> 提供服务,并进行反向代理,将请求正确的代理至后端。</p>
<pre><code>FROM node:10.13 as builder
WORKDIR /app
COPY . /app
RUN yarn install \
&amp;&amp; yarn build
FROM nginx:1.15
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /app/dist /usr/share/nginx/html/
EXPOSE 80
</code></pre>
@@ -555,13 +360,7 @@ server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root /usr/share/nginx/html;
@@ -569,9 +368,6 @@ server {
try_files $uri $uri/ /index.html;
}
location ~ ^/(api) {
proxy_pass http://backend-up;
@@ -589,9 +385,6 @@ server {
<p>后端是使用 <a href="https://golang.org/">Golang</a> 编写的 API 服务,对请求进行相应处理,并将数据存储至 <a href="http://redis.io/">Redis</a> 当中。依赖管理使用的是 <a href="https://github.com/golang/dep">dep</a>。由于 Golang 是编译型语言,编译完成后会生成一个二进制文件,为了让镜像尽可能小,所以 Dockerfile 和前端的差不多,都使用了<a href="https://docs.docker.com/develop/develop-images/multistage-build/">多阶段构建</a>的特性。</p>
<pre><code>FROM golang:1.11.1 as builder
WORKDIR /go/src/be
COPY . /go/src/be
@@ -601,9 +394,6 @@ RUN go get -u github.com/golang/dep/cmd/dep \
&amp;&amp; dep ensure \
&amp;&amp; go build
FROM debian:stretch-slim
COPY --from=builder /go/src/be/be /usr/bin/be
@@ -621,17 +411,11 @@ EXPOSE 8080
<p>Work 端使用的是 <a href="https://python.org/">Python</a>,用于计算已经存储至 Redis 当中的数据,并生成排行榜。依赖使用 <a href="https://github.com/pypa/pip">pip</a> 进行安装。对于 Python 的镜像选择,我做了一组<a href="http://moelove.info/docker-python-perf/">性能对比的测试</a> 有兴趣可以了解下。</p>
<pre><code>FROM python:3.7-slim
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
ENTRYPOINT [&quot;python&quot;, &quot;work.py&quot;]
</code></pre>
@@ -669,9 +453,6 @@ ENTRYPOINT [&quot;python&quot;, &quot;work.py&quot;]
<p><a href="https://docs.docker.com/compose/overview/">Docker Compose</a> 是一种较为简单的可进行容器编排的技术,需要创建一个配置文件,通常情况下为 <code>docker-compose.yml</code> 。在 saythx 项目的根目录下我已经创建好了 <code>docker-compose.yml</code> 的配置文件。</p>
<pre><code>version: '3'
services:
saythx-frontend:
@@ -693,9 +474,6 @@ services:
networks:
- saythx
saythx-backend:
build:
@@ -739,9 +517,6 @@ services:
- REDIS_HOST=saythx-redis
- REDIS_PORT=6379
saythx-redis:
image: &quot;redis:5&quot;
@@ -749,9 +524,6 @@ services:
networks:
- saythx
networks:
saythx:
@@ -765,9 +537,6 @@ networks:
<p>打开另外的终端,进入项目根目录内,执行 <code>docker-compose ps</code> 命令即可看到当前的服务情况。</p>
<pre><code>➜ saythx git:(master) ✗ docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------------
@@ -909,15 +678,9 @@ deployment.apps/saythx-redis created
NAME READY STATUS RESTARTS AGE
pod/saythx-redis-79d8f9864d-x8fp9 1/1 Running 0 4s
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.apps/saythx-redis 1 1 1 1 4s
NAME DESIRED CURRENT READY AGE
replicaset.apps/saythx-redis-79d8f9864d 1 1 1 4s
@@ -1057,23 +820,14 @@ NAME READY STATUS RESTARTS AG
pod/saythx-backend-c5f9f6d95-lmtxn 0/1 ContainerCreating 0 5s
pod/saythx-redis-8558c7d7d-kcmzk 1/1 Running 0 17m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/saythx-redis NodePort 10.107.31.242 &lt;none&gt; 6379:31467/TCP 1m
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.apps/saythx-backend 1 1 1 0 5s
deployment.apps/saythx-redis 1 1 1 1 17m
NAME DESIRED CURRENT READY AGE
replicaset.apps/saythx-backend-c5f9f6d95 1 1 0 5s
@@ -1207,17 +961,11 @@ pod/saythx-backend-c5f9f6d95-lmtxn 1/1 Running 0 16m
pod/saythx-frontend-678d544b86-wp9gr 1/1 Running 0 30s
pod/saythx-redis-8558c7d7d-kcmzk 1/1 Running 0 34m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/saythx-backend NodePort 10.104.0.47 &lt;none&gt; 8080:32051/TCP 15m
service/saythx-redis NodePort 10.107.31.242 &lt;none&gt; 6379:31467/TCP 18m
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.apps/saythx-backend 1 1 1 1 16m
@@ -1225,9 +973,6 @@ deployment.apps/saythx-backend 1 1 1 1 1
deployment.apps/saythx-frontend 1 1 1 1 30s
deployment.apps/saythx-redis 1 1 1 1 34m
NAME DESIRED CURRENT READY AGE
replicaset.apps/saythx-backend-c5f9f6d95 1 1 1 16m
@@ -1367,9 +1112,6 @@ pod/saythx-frontend-678d544b86-wp9gr 1/1 Running 0
pod/saythx-redis-8558c7d7d-kcmzk 1/1 Running 0 39m
pod/saythx-work-6b9958dc47-hh9td 0/1 ContainerCreating 0 7s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/saythx-backend NodePort 10.104.0.47 &lt;none&gt; 8080:32051/TCP 20m
@@ -1377,9 +1119,6 @@ service/saythx-backend NodePort 10.104.0.47 &lt;none&gt; 8080:32
service/saythx-frontend NodePort 10.96.221.71 &lt;none&gt; 80:32682/TCP 3m
service/saythx-redis NodePort 10.107.31.242 &lt;none&gt; 6379:31467/TCP 23m
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.apps/saythx-backend 1 1 1 1 22m
@@ -1389,9 +1128,6 @@ deployment.apps/saythx-frontend 1 1 1 1 5
deployment.apps/saythx-redis 1 1 1 1 39m
deployment.apps/saythx-work 1 1 1 0 7s
NAME DESIRED CURRENT READY AGE
replicaset.apps/saythx-backend-c5f9f6d95 1 1 1 22m
@@ -1443,9 +1179,6 @@ replicaset.apps/saythx-work-6b9958dc47 1 1 0 7s
</div>
</div>
</div>
</div>
@@ -1453,9 +1186,6 @@ replicaset.apps/saythx-work-6b9958dc47 1 1 0 7s
</div>
</div>
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
</div>
@@ -1471,17 +1201,11 @@ replicaset.apps/saythx-work-6b9958dc47 1 1 0 7s
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-NPSEEVD756');
@@ -1507,9 +1231,6 @@ replicaset.apps/saythx-work-6b9958dc47 1 1 0 7s
setCookie("lastPath", path)
}
function setCookie(cname, cvalue) {
var d = new Date();
@@ -1521,9 +1242,6 @@ replicaset.apps/saythx-work-6b9958dc47 1 1 0 7s
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
}
function getCookie(cname) {
var name = cname + "=";
@@ -1541,12 +1259,6 @@ replicaset.apps/saythx-work-6b9958dc47 1 1 0 7s
return "";
}
</script>
</html>