From 7c6d983e6e9fa0f0e2c7685ace5b9ad622c1b0dd Mon Sep 17 00:00:00 2001 From: John Jian Date: Fri, 22 Nov 2024 21:49:27 +0800 Subject: [PATCH] Update posts --- README.md | 8 +- _drafts/2018-06-24-install-ruby-with-rbenv.md | 14 ++-- ...19-install-express-nginx-docker-compose.md | 12 +-- _drafts/2020-03-18-terraform.md | 4 +- _drafts/2020-11-20-kubernetes.md | 28 +++---- _drafts/2021-02-24-helm.md | 2 +- _drafts/2023-07-31-rust.md | 4 +- _posts/2018-06-24-git.md | 70 ++++++++++------- _posts/2018-07-19-docker.md | 11 ++- _posts/2020-03-09-install-iterm2-oh-my-zsh.md | 8 +- ...20-05-05-terraform-deploy-static-to-cos.md | 10 +-- _posts/2021-02-26-anaconda.md | 45 +++++++++-- ...-101-pods-nodes-containers-and-clusters.md | 78 +++++++++++++++++++ 13 files changed, 212 insertions(+), 82 deletions(-) create mode 100644 _posts/2024-11-14-kubernetes-101-pods-nodes-containers-and-clusters.md diff --git a/README.md b/README.md index 1e7d2d4..d1e47fe 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## 安装 Ruby -```shell +```console $ rbenv install 3.3.3 $ rbenv global 3.3.3 $ rbenv versions @@ -10,7 +10,7 @@ $ rbenv versions ## 安装第三方库 -```shell +```console $ gem update --system $ gem install bundler $ bundle update @@ -18,14 +18,14 @@ $ bundle update ## 启动 -```shell +```console $ jekyll serve # $ bundle exec jekyll serve ``` ## 生成语法高亮样式 -```shell +```console $ rougify help style $ rougify style github > assets/css/highlight-github.css ``` diff --git a/_drafts/2018-06-24-install-ruby-with-rbenv.md b/_drafts/2018-06-24-install-ruby-with-rbenv.md index 275e964..9396771 100644 --- a/_drafts/2018-06-24-install-ruby-with-rbenv.md +++ b/_drafts/2018-06-24-install-ruby-with-rbenv.md @@ -13,14 +13,14 @@ color: "#fff" 先安装依赖包 -```shell +```console $ sudo apt-get update $ sudo apt-get install -y autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev ``` 接着安装 rbenv,如果是 macos,推荐使用 Homebrew 安装。 -```shell +```console $ brew install rbenv $ echo 'export PATH="$PATH:$HOME/.rbenv/bin"' >> ~/.zshrc $ echo 'eval "$(rbenv init -)"' >> ~/.zshrc @@ -31,26 +31,26 @@ $ source ~/.zshrc Restart your shell so that PATH changes take effect. Verify that rbenv is properly set up using this rbenv-doctor script 重新打开 Shell,使 PATH 生效。用 `type rbenv` 或者下面语句来检验 rbenv 是否已经设置好了。 -```shell +```console $ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash ``` ### Install ruby-build as an rbenv plugin(安装插件 ruby-build) -```shell +```console $ mkdir -p "$(rbenv root)"/plugins $ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build ``` ### Install Ruby -```shell +```console $ rbenv install --verbose 2.7.2 ``` 如果无法直接在线安装,可以[安装下载好的 Ruby 文件](https://stackoverflow.com/questions/35589469/install-ruby-using-rbenvs-downloaded-file/35589999#35589999)。 -```shell +```console $ mkdir ~/.rbenv/cache $ cp ~/Downloads/ruby-2.7.2.tar.bz2 ~/.rbenv/cache/ $ env RUBY_BUILD_MIRROR_URL=file:///home/$(whoami)/.rbenv/cache/ruby-2.7.2.tar.bz2 @@ -58,7 +58,7 @@ $ env RUBY_BUILD_MIRROR_URL=file:///home/$(whoami)/.rbenv/cache/ruby-2.7.2.tar.b ### Set default Ruby(设置默认的 Ruby 版本) -```shell +```console $ rbenv global 2.7.2 $ rbenv versions ``` diff --git a/_drafts/2018-07-19-install-express-nginx-docker-compose.md b/_drafts/2018-07-19-install-express-nginx-docker-compose.md index d42bdef..54a6a1e 100644 --- a/_drafts/2018-07-19-install-express-nginx-docker-compose.md +++ b/_drafts/2018-07-19-install-express-nginx-docker-compose.md @@ -12,13 +12,13 @@ Compose is a tool for defining and running multi-container Docker applications. Run this command to download the latest version of Docker Compose: -```shell +```console $ sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose ``` Apply executable permissions to the binary: -```shell +```console $ sudo chmod +x /usr/local/bin/docker-compose ``` @@ -55,7 +55,7 @@ mongodb: 创建 VOLUMES 目录 -```shell +```console $ mkdir -p /home/vagrant/nginx/conf.d $ mkdir -p /home/vagrant/mongodb ``` @@ -79,7 +79,7 @@ server { 运行 docker-compose -```shell +```console $ docker-compose -f compose-nginx-nodejs-mongodb.yml up ``` @@ -87,7 +87,7 @@ $ docker-compose -f compose-nginx-nodejs-mongodb.yml up ## 常用命令 -```shell +```console $ docker volume ls $ docker volume prune $ docker volume inspect delivery_storage @@ -107,7 +107,7 @@ $ docker-compose exec fpm php artisan route:cache 您需要使用注册表名称和要将其推送到的存储库来标记您的映像。 例如,要将名为 my-image 的映像推送到 Docker Hub 注册表,您可以使用以下命令: -```shell +```console $ docker tag my-image:latest docker.io/my-username/my-image:latest $ docker push docker.io/my-username/my-image:latest ``` diff --git a/_drafts/2020-03-18-terraform.md b/_drafts/2020-03-18-terraform.md index 86566cd..6c7973c 100644 --- a/_drafts/2020-03-18-terraform.md +++ b/_drafts/2020-03-18-terraform.md @@ -16,13 +16,13 @@ HashiCorp 维护着广泛的官方提供商列表,并且还可以与社区开 首先,安装 HashiCorp Tap,它是我们所有 Homebrew 软件包的存储库。 -```shell +```console $ brew tap hashicorp/tap ``` 现在,使用 hashcorp/tap/terraform 安装 Terraform。 -```shell +```console $ brew install hashicorp/tap/terraform ``` diff --git a/_drafts/2020-11-20-kubernetes.md b/_drafts/2020-11-20-kubernetes.md index 511f395..b01f32b 100644 --- a/_drafts/2020-11-20-kubernetes.md +++ b/_drafts/2020-11-20-kubernetes.md @@ -7,21 +7,21 @@ Kubernetes 常用命令 ## Deployment(部署) -```shell +```console $ kubectl get deployments # List deployments(查看列表 deployments) $ kubectl get pods -o wide # let’s check if the number of Pods changed (查看列表 Pods) ``` ## Scale(扩展) -```shell +```console $ kubectl get rs # Show replicas $ kubectl scale deployments/kubernetes-bootcamp --replicas=4 # Scale up $ kubectl scale deployments/kubernetes-bootcamp --replicas=2 # Scale down $ kubectl describe deployments/kubernetes-bootcamp # The change was registered in the Deployment events log. ``` -```shell +```console {% raw %}$ export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"{% endraw %} $ echo "NODE_PORT=$NODE_PORT" $ curl http://"$(minikube ip):$NODE_PORT" @@ -34,19 +34,19 @@ $ curl http://"$(minikube ip):$NODE_PORT" 回滚更新 让我们执行另一次更新,并尝试部署带有 v10 标记的映像: -```shell +```console $ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10 ``` 使用 get deployments 查看部署的状态: -```shell +```console $ kubectl get deployments ``` 请注意,输出并未列出所需的可用 Pod 数量。 运行 get pods 子命令以列出所有 Pod: -```shell +```console $ kubectl get pods ``` @@ -54,7 +54,7 @@ $ kubectl get pods 要更深入地了解问题,请运行 describe pods 子命令: -```shell +```console $ kubectl describe pods ``` @@ -62,7 +62,7 @@ $ kubectl describe pods 要将部署回滚到上一个工作版本,请使用 rollout undo 子命令: -```shell +```console $ kubectl rollout undo deployments/kubernetes-bootcamp ``` @@ -70,13 +70,13 @@ rollout undo 命令将部署恢复到之前的已知状态(映像的 v2)。 使用 get pods 子命令再次列出 Pod: -```shell +```console $ kubectl get pods ``` 四个 Pod 正在运行。 要检查部署在这些 Pod 上的映像,请使用describe pods 子命令: -```shell +```console $ kubectl describe pods ``` @@ -84,20 +84,20 @@ $ kubectl describe pods 请记住清理本地集群 -```shell +```console $ kubectl delete deployments/kubernetes-bootcamp services/kubernetes-bootcamp ``` ## 获取配置上下文,切换环境 -```shell +```console $ kubectl config --kubeconfig=$HOME/.kube/config get-contexts # 列出上下文环境 $ kubectl config --kubeconfig=$HOME/.kube/config use-context minikube # 使用上下文环境 ``` 比如,要切换到腾讯云 TKE -```shell +```console $ export KUBECONFIG=$KUBECONFIG:$HOME/cls-7ta42ut4-config # 先添加新的上下文环境 $ kubectl config --kubeconfig=$HOME/cls-7ta42ut4-config get-contexts @@ -108,7 +108,7 @@ $ kubectl config --kubeconfig=$HOME/cls-7ta42ut4-config use-context cls-7ta42ut4 Switched to context "cls-7ta42ut4-100000777545-context-default". ``` -```shell +```console $ kubectl get pods --field-selector=status.phase=Failed $ kubectl delete pods --field-selector=status.phase=Failed # 批量删除 ``` diff --git a/_drafts/2021-02-24-helm.md b/_drafts/2021-02-24-helm.md index d60f0c8..586abb0 100644 --- a/_drafts/2021-02-24-helm.md +++ b/_drafts/2021-02-24-helm.md @@ -21,6 +21,6 @@ Helm 是 Kubernetes 的包管理器,Kubernetes 是一个开源容器编排平 ## 安装 -```shell +```console $ brew install helm ``` diff --git a/_drafts/2023-07-31-rust.md b/_drafts/2023-07-31-rust.md index cedd45e..3d0224e 100644 --- a/_drafts/2023-07-31-rust.md +++ b/_drafts/2023-07-31-rust.md @@ -22,7 +22,7 @@ Often, cargo check is much faster than cargo build because it skips the step of 让我们回顾一下我们到目前为止对 Cargo 的了解: -```shell +```console $ cargo new # 创建一个项目。 $ cargo build # 构建一个项目。 $ cargo run # 一步构建和运行一个项目。 @@ -56,4 +56,4 @@ $ cargo build 直接使用 rustc 编写和运行“Hello, world!”程序 使用 Cargo 的约定创建和运行新项目 -这是构建更实质性的程序以习惯于阅读和编写 Rust 代码的好时机。因此,在第 2 章中,我们将构建一个猜谜游戏程序。如果您更愿意先了解 Rust 中常见的编程概念,请参阅第 3 章,然后再返回第 2 章。 \ No newline at end of file +这是构建更实质性的程序以习惯于阅读和编写 Rust 代码的好时机。因此,在第 2 章中,我们将构建一个猜谜游戏程序。如果您更愿意先了解 Rust 中常见的编程概念,请参阅第 3 章,然后再返回第 2 章。 diff --git a/_posts/2018-06-24-git.md b/_posts/2018-06-24-git.md index 9d375b6..422394c 100644 --- a/_posts/2018-06-24-git.md +++ b/_posts/2018-06-24-git.md @@ -12,7 +12,7 @@ Git 是一个免费的开源分布式版本控制系统,旨在快速高效地 在 macOS 上推荐使用 [Homebrew]({% post_url 2020-03-09-install-iterm2-oh-my-zsh %}) 安装 Git。 -```shell +```console $ brew install git ``` @@ -25,13 +25,13 @@ $ brew install git 生成秘钥: -```shell +```console $ ssh-keygen -t rsa -b 4096 -C "your.name@gmail.com" ``` 复制生成的公钥,加入到 GitHub 上:Settings > Access > SSH and GPG keys -```shell +```console $ clip < ~/.ssh/id_rsa.pub # 在 Windows 上复制到剪切板 $ clipcopy ~/.ssh/id_rsa.pub # zsh ``` @@ -42,7 +42,7 @@ $ clipcopy ~/.ssh/id_rsa.pub # zsh 在本地电脑上,设置提交人的身份信息 -```shell +```console $ git config --global user.name "Your Name" $ git config --global user.email "your.name@gmail.com" ``` @@ -59,19 +59,19 @@ $ git config --global user.email "your.name@gmail.com" 然后拉取仓库到本地电脑 -```shell +```console $ git pull git@github.com:john/myapp.git ``` 接着设置远程的 origin 仓库地址 -```shell +```console $ git remote set-url origin git@github.com:john/myapp.git ``` 再从公共分支合并到自己的主分支,同样要设置远程的 upstream 仓库地址 -```shell +```console $ git remote add upstream git@github.com:nighon/myapp.git ``` @@ -79,7 +79,7 @@ $ git remote add upstream git@github.com:nighon/myapp.git 开发过程中,需要拉取并合并 nighon/master => john/master(本地) -```shell +```console $ git fetch upstream $ git checkout master $ git merge upstream/master @@ -87,7 +87,7 @@ $ git merge upstream/master 每次需要添加功能时,通常会新建一个分支。从 master 新建分支 -```shell +```console $ git checkout -b my-awesome-feature master # 或者是为修复问题而新建分支 (fix issue) @@ -105,7 +105,7 @@ $ git checkout -b fix-something-wrong master **每次开发完成功能分支后,把功能分支合并到主分支的步骤:** -```shell +```console # This moves your feature branch commits on top of the latest commits from main, # resulting in a linear and clean history. # 这会将您的功能分支提交移至主分支的最新提交之上,从而产生线性且干净的历史记录。 @@ -131,32 +131,48 @@ $ git branch -d feature-branch $ git push origin --delete feature-branch ``` +```console +# 推送到 dev1 分支 +$ git commit -m 'something' +$ git push origin dev1 + +# 当前分支是 dev1 +# 把 dev1 分支强制推送到 dev2 分支(**注意会覆盖 dev2**) +$ git push origin +HEAD:dev2 +``` + ## 常用指令 (Cheat Sheet) 以 `HEAD~` 为示范 commit id
以 `README.md` 为示范文件名 -```shell -$ git checkout HEAD~ -- README.md # 恢复文件 -$ git clean -fd # 清除未包含的文件 -$ git push origin +HEAD~:master # 强制推送(覆盖)远程分支 -$ git log -p -- README.md # 列出单个文件历史改动记录 -$ git log --follow -- README.md # 列出单个文件历史改动记录 -$ git log README.md # 这是查看文件提交历史记录的最基本方法。 -$ git blame README.md # 这将列出所有提交已对指定文件进行的操作,以及每次提交的作者以及提交的日期和时间。 -$ git diff HEAD~ # 列出改动 -$ git diff-tree --no-commit-id --name-only -r HEAD~ # 列出改动的文件 -$ git branch -d my-awesome-feature # 删除本地分支 -$ git -C ../nighon.github.io status # 切换目录,再进行操作 -$ git commit -m "Your commit message" --no-verify # 跳过语法检查的钩子 Bypass Hooks pre-commit +```console +$ git checkout HEAD~ -- README.md # 恢复文件 +$ git clean -fd # 清除未包含的文件 +$ git push origin +HEAD~:master # 强制推送(覆盖)远程分支 +$ git log -p -- README.md # 列出单个文件历史改动记录 +$ git log --follow -- README.md # 列出单个文件历史改动记录 +$ git log README.md # 这是查看文件提交历史记录的最基本方法。 +$ git blame README.md # 这将列出所有提交已对指定文件进行的操作,以及每次提交的作者以及提交的日期和时间。 +$ git diff HEAD~ # 列出改动 +$ git diff-tree --no-commit-id --name-only -r HEAD~ # 列出改动的文件 +$ git branch -d my-awesome-feature # 删除本地分支 +$ git -C ../nighon.github.io status # 切换目录,再进行操作 +$ git commit -m "Your commit message" --no-verify # 跳过语法检查的钩子 Bypass Hooks pre-commit +$ git revert # 撤销特定的 commit +$ git revert .. # 撤销一系列的 commit +$ git reflog show # 查看某个分支的 reflog +$ git reset --hard # 恢复到某个历史节点 +$ git reflog expire --expire=now --all # 清理 reflog 记录 ``` branch,tag 操作 -```shell -$ git tag rc-1 # 新建 tag, -a 'create release candidate 1' -$ git push origin --all # 推送所有 branches -$ git push origin --tags # 推送所有 tags +```console +$ git tag rc-1 # 新建 tag, -a 'create release candidate 1' +$ git push origin --all # 推送所有 branches +$ git push origin --tags # 推送所有 tags +$ git remote prune origin # error: 一些本地引用不能被更新;尝试运行 'git remote prune origin' 来删除旧的、有冲突的分支 ``` [忽略不在 .gitignore 中的文件](https://stackoverflow.com/a/653458/2862195)(这个设置只对本地生效) diff --git a/_posts/2018-07-19-docker.md b/_posts/2018-07-19-docker.md index e3b6318..2c62b43 100644 --- a/_posts/2018-07-19-docker.md +++ b/_posts/2018-07-19-docker.md @@ -10,11 +10,15 @@ Docker 是一种工具,用于自动在轻量级容器中部署应用程序, 首先,[在 macOS 上安装 Docker Desktop](https://docs.docker.com/desktop/install/mac-install/#install-and-run-docker-desktop-on-mac)。 -```shell +```console $ brew install --cask docker # 安装 Docker Desktop $ brew install docker-compose # 安装 Docker Compose ``` +```console +$ docker run -p 3000:3000 -d get-started:latest # --restart=always --name get-started-test --rm -it +``` + ## Docker Compose Docker Compose 是一种用于定义和运行多容器应用程序的工具。它是解锁简化且高效的开发和部署体验的关键。 @@ -28,7 +32,7 @@ Compose 适用于所有环境;生产、准备、开发、测试以及 CI 工 - 流式传输正在运行的服务的日志输出 - 在服务上运行一次性命令 -```shell +```console $ docker compose build app $ docker compose up -d $ docker compose down @@ -45,7 +49,7 @@ $ docker compose down ## 常用命令 -```shell +```console $ docker volume ls $ docker volume prune $ docker volume inspect delivery_storage @@ -61,6 +65,7 @@ $ docker compose restart # 重启所有服务 $ docker compose restart app # 重启某个服务 $ docker compose logs -f # 查看所有服务的日志 $ docker compose logs app -f # 查看某个服务的日志 +$ docker-compose up -d --scale worker=3 --no-recreate # 容器内运行命令 $ docker compose exec redis redis-cli FLUSHALL # 在现有的容器内,执行命令 diff --git a/_posts/2020-03-09-install-iterm2-oh-my-zsh.md b/_posts/2020-03-09-install-iterm2-oh-my-zsh.md index 0b5e90c..8399f85 100644 --- a/_posts/2020-03-09-install-iterm2-oh-my-zsh.md +++ b/_posts/2020-03-09-install-iterm2-oh-my-zsh.md @@ -11,7 +11,7 @@ bgcolor: "#cfc" Homebrew 是一个免费的开源软件包管理系统,可简化 macOS 上的软件安装。 -```shell +```console $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ``` @@ -19,7 +19,7 @@ $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ iTerm2 是一款适用于 macOS 的免费开源终端模拟器,用来替代系统默认的 Terminal。 -```shell +```console $ brew install --cask iterm2 ``` @@ -28,7 +28,7 @@ $ brew install --cask iterm2 Zsh 是一种专为交互式使用而设计的 shell,同时它也是一种功能强大的脚本语言。
Oh My Zsh 是一个用于管理 Zsh 配置的开源框架。 -```shell +```console $ brew install zsh && sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" ``` @@ -36,7 +36,7 @@ $ brew install zsh && sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmy ## 设置色彩和样式 -```shell +```console $ cd Downloads && curl -O https://raw.githubusercontent.com/MartinSeeler/iterm2-material-design/master/material-design-colors.itermcolors ``` diff --git a/_posts/2020-05-05-terraform-deploy-static-to-cos.md b/_posts/2020-05-05-terraform-deploy-static-to-cos.md index 4ee1df8..2186acf 100644 --- a/_posts/2020-05-05-terraform-deploy-static-to-cos.md +++ b/_posts/2020-05-05-terraform-deploy-static-to-cos.md @@ -23,13 +23,13 @@ HashiCorp 维护着广泛的官方提供商列表,并且还可以与社区开 首先,安装 HashiCorp Tap,它是我们所有 Homebrew 软件包的存储库。 -```shell +```console $ brew tap hashicorp/tap ``` 现在,使用 hashcorp/tap/terraform 安装 Terraform。 -```shell +```console $ brew install hashicorp/tap/terraform ``` @@ -52,7 +52,7 @@ availability_region = "ap-singapore" availability_zone = "ap-singapore-4" ``` -```shell +```console $ echo 'terraform.tfvars' >> .gitignore # 在版本库中忽略该文件 ``` @@ -204,7 +204,7 @@ resource "tencentcloud_cos_bucket_object" "example" { 创建 404.html 文件,提供更友好的 404 页面: -```shell +```console $ echo '404Page not found.' > 404.html ``` @@ -274,7 +274,7 @@ resource "tencentcloud_dnspod_record" "example" { ## 运行 Terraform -```shell +```console $ terraform init $ terraform plan $ terraform apply --auto-approve diff --git a/_posts/2021-02-26-anaconda.md b/_posts/2021-02-26-anaconda.md index 33795aa..c91522e 100644 --- a/_posts/2021-02-26-anaconda.md +++ b/_posts/2021-02-26-anaconda.md @@ -13,20 +13,20 @@ Anaconda 因其易用性、全面的软件包选择以及有效管理依赖关 采用 [PyTorch 文档提供的命令行安装方法](https://pytorch.org/get-started/locally/#anaconda): -```shell +```console $ curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh $ sh Miniconda3-latest-MacOSX-arm64.sh ``` 或者用 Homebrew 安装。安装后,如果在 zsh 环境下报错 `conda not found`,先[运行初始化](https://gist.github.com/ryanorsinger/7d89ad58901b5590ec3e1f23d7b9f887?permalink_comment_id=3806602#gistcomment-3806602)。 -```shell +```console $ brew install --cask anaconda ``` ## 更新 -```shell +```console $ conda update --all $ conda update -n myenv conda $ conda update -n myenv --all @@ -34,7 +34,7 @@ $ conda update -n myenv --all ## 卸载 -```shell +```console $ rm -rf ~/miniconda3/ # 删除目录 $ rm -rf ~/.conda* # 删除配置文件 $ vim ~/.zshrc # 删除相关配置 @@ -42,7 +42,7 @@ $ vim ~/.zshrc # 删除相关配置 ## 管理环境 -```shell +```console $ conda create -n myenv python # 创建环境 -n, --name $ conda create -n myenv python=3.11 # 创建环境,并指定 Python 版本 $ conda create -n myenv --clone base # 复制 base 环境 @@ -52,7 +52,7 @@ $ conda create -n myenv --clone base # 复制 base 环境 创建环境后,所有的库都会安装到该环境目录下,包括 Python 和 Pip -```shell +```console $ conda create -n jupyter python $ conda activate jupyter $ (jupyter) which python # /Users/john/miniconda3/envs/web/bin/python @@ -63,6 +63,37 @@ $ (jupyter) which jupyterlab # /Users/john/miniconda3/envs/web/bin/jupyterlab ## 删除环境 -```shell +```console $ conda remove -n jupyter --all ``` + + +## uv 常用操作 + +```console +$ uv init example + +$ uv python install 3.10 3.11 3.12 +$ uv python list +$ uv python pin 3.10 +Updated `.python-version` from `3.12` -> `3.10` + +$ uv run python --version +$ uv venv +$ uv venv my_directory_name_instead_of_the_default_name_venv + +$ uv add ruff # pyproject.toml also updated + +$ uv pip install ruff +$ uv pip install pandas==2.1.0 flask +$ uv pip list +``` + +## 虚拟环境内部操作 + +```console +$ source .venv/bin/activate # source my_directory_name/bin/activate +$ deactivate + +$ pip install pandas==2.1.0 flask +``` diff --git a/_posts/2024-11-14-kubernetes-101-pods-nodes-containers-and-clusters.md b/_posts/2024-11-14-kubernetes-101-pods-nodes-containers-and-clusters.md new file mode 100644 index 0000000..5bf3b8f --- /dev/null +++ b/_posts/2024-11-14-kubernetes-101-pods-nodes-containers-and-clusters.md @@ -0,0 +1,78 @@ +--- +layout: post +title: Kubernetes 101:Pod、节点、容器和集群 +--- + +Kubernetes 正迅速成为在云中部署和管理软件的新标准。然而,Kubernetes 提供的所有功能都伴随着陡峭的学习曲线。作为新手,尝试解析官方文档可能会让人不知所措。系统由许多不同的部分组成,很难分辨哪些部分与您的用例相关。这篇博文将提供 Kubernetes 的简化视图,但它将尝试对最重要的组件及其如何组合在一起进行高级概述。 + +首先,让我们看看硬件是如何表示的 + +## Hardware + +### Nodes + +节点是 Kubernetes 中计算硬件的最小单位。它代表集群中的一台机器。在大多数生产系统中,节点可能是数据中心中的物理机器,也可能是托管在 Google Cloud Platform 等云提供商上的虚拟机。但是,不要让惯例限制您;理论上,几乎任何东西都可以成为节点。 + +将机器视为“节点”使我们能够插入一个抽象层。现在,我们不必担心任何单个机器的独特特性,而是可以简单地将每台机器视为一组可以利用的 CPU 和 RAM 资源。这样,任何机器都可以替代 Kubernetes 集群中的任何其他机器。 + + +### The Cluster + +尽管使用单个节点很有用,但这不是 Kubernetes 的方式。通常,您应该将集群视为一个整体,而不必担心单个节点的状态。 + +在 Kubernetes 中,节点将资源汇集在一起​​以形成更强大的机器。当您将程序部署到集群上时,它会智能地为您处理将工作分配给单个节点。如果添加或删除任何节点,集群将根据需要转移工作。对于程序或程序员来说,哪些单个机器实际上在运行代码并不重要。 + +如果这种类似蜂巢思维的系统让您想起了《星际迷航》中的博格人,那么您并不孤单;“博格”是 Kubernetes 所基于的内部 Google 项目的名称。 + + +### Persistent Volumes + +由于集群上运行的程序不能保证在特定节点上运行,因此数据无法保存到文件系统中的任意位置。如果程序尝试将数据保存到文件中以供日后使用,但随后被重新定位到新节点,则该文件将不再位于程序预期的位置。因此,与每个节点关联的传统本地存储被视为临时缓存以保存程序,但本地保存的任何数据都无法持久保存。 + +为了永久存储数据,Kubernetes 使用持久卷。虽然所有节点的 CPU 和 RAM 资源都由集群有效地汇集和管理,但持久文件存储却不是。相反,本地或云驱动器可以作为持久卷连接到集群。这可以被认为是将外部硬盘插入集群。持久卷提供了一个可以挂载到集群的文件系统,而无需与任何特定节点关联。 + +## Software + +### Containers + +在 Kubernetes 上运行的程序被打包为 Linux 容器。容器是一种被广泛接受的标准,因此已经有许多预构建的映像可以部署在 Kubernetes 上。 + +容器化允许您创建独立的 Linux 执行环境。任何程序及其所有依赖项都可以捆绑到一个文件中,然后在互联网上共享。任何人都可以下载容器并将其部署在他们的基础设施上,只需很少的设置即可。创建容器可以通过编程方式完成,从而形成强大的 CI 和 CD 管道。 + +可以将多个程序添加到单个容器中,但如果可能的话,您应该将每个容器限制为一个进程。拥有多个小容器比拥有一个大容器更好。如果每个容器都有一个紧密的焦点,则更新更容易部署,问题也更容易诊断。 + +### Pods + +与您过去可能使用过的其他系统不同,Kubernetes 并不直接运行容器;而是将一个或多个容器包装到称为 pod 的更高级结构中。同一 pod 中的任何容器都将共享相同的资源和本地网络。容器可以轻松地与同一 pod 中的其他容器进行通信,就像它们在同一台机器上一样,同时保持与其他容器的一定程度的隔离。 + +Pod 用作 Kubernetes 中的复制单元。如果您的应用程序变得过于流行,并且单个 pod 实例无法承载负载,则可以配置 Kubernetes 以根据需要将 pod 的新副本部署到集群。即使负载不重,在生产系统中随时运行多个 pod 副本也是标准做法,以实现负载平衡和故障抵抗。 + +Pod 可以容纳多个容器,但您应该尽可能限制自己。由于 pod 作为一个单元进行扩展和缩小,因此 pod 中的所有容器都必须一起扩展,而不管它们各自的需求如何。这会导致资源浪费和昂贵的费用。为了解决这个问题,pod 应该尽可能保持小,通常只包含一个主进程及其紧密耦合的辅助容器(这些辅助容器通常称为“side-car”)。 + +### Deployments + +尽管 Pod 是 Kubernetes 中计算的基本单位,但它们通常不会直接在集群上启动。相反,Pod 通常由另一个抽象层进行管理:部署。 + +部署的主要目的是声明一次应运行多少个 Pod 副本。将部署添加到集群后,它将自动启动请求的 Pod 数量,然后监视它们。如果 Pod 死亡,部署将自动重新创建它。 + +使用部署,您无需手动处理 Pod。您只需声明系统的所需状态,它就会自动为您管理。 + +### Ingress + +使用上面描述的概念,您可以创建一个节点集群,并在集群上启动 Pod 部署。但是,还有最后一个问题需要解决:允许外部流量进入您的应用程序。 + +默认情况下,Kubernetes 提供 Pod 与外界之间的隔离。如果您想与 Pod 中运行的服务进行通信,则必须打开一个通信通道。这称为入口。 + +有多种方法可以将入口添加到集群。最常见的方法是添加入口控制器或负载均衡器。这两个选项之间的确切权衡超出了本文的范围,但您必须意识到,在尝试使用 Kubernetes 之前,您需要处理入口。 + +## 下一步 + +上面描述的是 Kubernetes 的一个过于简化的版本,但它应该为您提供了开始实验所需的基础知识。现在您已经了解了组成系统的各个部分,是时候使用它们来部署真正的应用程序了。查看 Kubernetes 110:您的首次部署以开始使用。 + +要在本地试验 Kubernetes,Minikube 将在您的个人硬件上创建一个虚拟集群。如果您已准备好尝试云服务,Google Kubernetes Engine 提供了一系列教程来帮助您入门。 + +如果您是容器和 Web 基础设施领域的新手,我建议您阅读 12 要素应用方法。这描述了在设计在 Kubernetes 等环境中运行的软件时要牢记的一些最佳实践。 + +最后,要获得更多此类内容,请务必在 Medium 和 Twitter 上关注我(@DanSanche21)。 + +原文链接: [Kubernetes 101: Pods, Nodes, Containers, and Clusters](https://medium.com/google-cloud/kubernetes-101-pods-nodes-containers-and-clusters-c1509e409e16)