在我的Mac上使用Kubernetes启动多个nginx实例
为了确认 Kubernetes 的运行情况,我们将在本地的 Mac 上启动多个 nginx 实例来尝试。
在Mac上启用Kubernetes的Docker功能
-
- Docker アイコン > Preferences > Kubernetes > Enable Kubernetes > ラジオボタンを Kubernetes にする
-
- Apply
- Install
使用此命令,将安装Kubernetes 的命令行工具 kubectl。
要了解Kubernetes的状态,可以使用kubectl get命令,但如果不知道有哪些资源的话就无法使用。安装Kubernetes Dashboard可以在浏览器中查看信息,非常方便。
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"clean", BuildDate:"2018-05-21T09:17:39Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"clean", BuildDate:"2018-05-21T09:05:37Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
$ kubectl get pods --all-namespaces -l k8s-app=kubernetes-dashboard
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system kubernetes-dashboard-7b9c7bc8c9-9nhlp 1/1 Running 0 4m
$ kubectl proxy
-
- ブラウザで http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/ を開く
-
- Kubernetes Dashboard で Skip を選択
- Kubernetes Dashboard が表示される。
上述命令的含义:
kubectl apply
指定されたファイルを元にリソースを設定する。
kubectl get
指定されたリソースの情報を表示する。
pods はリソースの種類
-l (–selector) でフィルタをかけることが出来る。
自动完成设置
在zsh的情况下:
echo "if [ $commands[kubectl] ]; then source <(kubectl completion zsh); fi" >> ~/.zshrc # add autocomplete permanently to your zsh shell
语言备忘录
-
- Kubernetes とは、Resource を組み合わせるもの。
-
- Resource とは、Docker container を組み合わせて使うための色々な部品。
Node: ホストマシンの事。
Namespace: リソースを分けて管理するための名前。
Pod: 一つ以上コンテナ。デプロイの単位。
Deployment: 同じコンテナを複数作るのに使う。またバージョン管理も出来る。
Service: Pod に名前をつけてお互いにアクセス出来るようにする。また外部からアクセス出来るようにする。
Services without Selectors を使うことで、クラスタと外部のサービスの連携を行う事も出来る。
Selector: Pod などを特定するのに使う。
選ばれる側のリソースは metadata.labels に辞書形式で定義する。
選ぶ側のリソースは selector などで指定する。
创建一个 Pod
以下是一个例子,用于定义容器的命令和参数。Pod是一个包含一个或多个容器的资源。
apiVersion: v1
kind: Pod # Kind でリソースの種類を指定する。
metadata:
name: command-demo # kubectl からこの名前で Pod を参照します。
labels:
purpose: demonstrate-command
spec:
containers:
- name: command-demo-container
image: debian
command: ["printenv"]
args: ["HOSTNAME", "KUBERNETES_PORT"]
restartPolicy: OnFailure
将此文件保存为名为commands.yaml的文件,并执行kubectl apply -f commands.yaml命令,即可创建此Pod。有趣的是,可以在参数中指定URL,作为替代:
kubectl apply -f https://k8s.io/examples/pods/commands.yaml
这个 Pod 会执行 printenv HOSTNAME KUBERNETES_PORT 的操作,以确认它是否正常运行。但它只是会移动并没有其他动作。要检查它的运行状态,请按照以下方式进行。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
command-demo 0/1 Completed 0 7m
您可以使用kubectl logs命令来查看输出结果。
$ kubectl logs command-demo
command-demo
tcp://10.96.0.1:443
要删除 Pod,您可以使用 kubectl delete 命令。有几种方法可以做到。
kubectl delete pod command-demo # 名前を指定
kubectl delete -f commands.yaml # ファイルを指定
kubectl delete pod/command-demo # kubectl get all の出力を使う
在这个例子中,一个 Pod 包含一个容器。由于 Pod 内共享一个 IP 地址,所以据说如果包含多个容器,它们可以通过 localhost 相互通信。
如果想使用本地图像,请在库名称和最新标签之外添加标签。
举个例子来说,以前提到的那个例子来说明。
image: debian
指定了像这样的图像,但在这种情况下将引用远程 Dockerhub 上的图像。如果想使用自己机器上未发布的图像,则需要给仓库名称和除了“latest”之外的标签。
远程工作的例子是引用
hoge
hoge:latest
可以查询本地数据的示例
fuga/hoge:1.0
使用部署
Deployment(部署)是用于部署容器的资源。以下是使用部署来运行无状态应用程序的示例。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx # template.metadata.labels に記載したラベルを指定します。
replicas: 2 # この数だけ pod を立ち上げます。
template:
metadata:
labels:
app: nginx # 作成する pod に割り振るラベルを指定します。
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
你可以通过指定URL来执行kubectl apply -f命令,例如:kubectl apply -f https://k8s.io/examples/application/deployment.yaml。执行后的状态如下。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-75675f5897-bgrph 1/1 Running 0 1m
nginx-deployment-75675f5897-dpv4m 1/1 Running 0 1m
然而,遗憾的是无法直接从开发机连接到Pod。每个Pod都被分配了一个IP,但是无法从主机端看到。需要先获取Pod的IP,然后使用kubectl run命令在Kubernetes集群中运行容器,使用curl命令访问IP。
$ kubectl describe pod nginx-deployment-75675f5897-bgrph | grep IP
IP: 10.1.0.67
$ kubectl run curl --image=byrnedo/alpine-curl -i --rm --tty --restart=Never http://10.1.0.67
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
kubectl run: イメージから適当なリソースを作って動かす。
–image: docker image を指定する。
-i: 標準出力を開いたままにする。
–rm: コマンド終了時に作成したリソースを消す。
–tty: コンテナごとに TTY を割り当てる。
–restart:
Always: Deployment を作る。常に再起動する
OnFailure: Job を作る。失敗時再起動する。
Never: Pod だけ作る。再起動はしない。
顺便说一下,要在容器中执行命令,可以使用 kubectl exec。
$ kubectl exec -it nginx-deployment-75675f5897-bgrph -- cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 7 (wheezy)"
NAME="Debian GNU/Linux"
VERSION_ID="7"
...
使用服务
好吧,如此下去就无法从外部连接到容器,因此毫无用处。要将容器与外部连接起来,需要使用Service的LoadBalancer类型。
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- name: http
port: 8087 # 公開するポート番号
targetPort: 80 # Pod のポート番号
服务是一种可以为一组Pod命名并使其能够相互通信的东西。例如,当执行上述的yaml时,在Kubernetes内部的DNS中将注册一个名为nginx的名字,并且能够通过名为nginx的名称访问带有app: nginx标签的Pod。在此示例中,将服务的8087端口转发到Pod的80端口。
kubectl apply -f service.yaml
kubectl run curl --image=byrnedo/alpine-curl -i --rm --tty --restart=Never http://nginx:8087
在 Service 中,有几种类型可供选择。在这个例子中,我们使用 LoadBalancer,因此可以直接从主机访问到 8087 端口。顺便一提,书上写着 LoadBalancer 不能在本地环境中使用,但是我不经意地尝试了一下,结果还是可以使用的。
curl http://localhost:8087
我已经启动了几个实例并成功从外部进行了访问。尚未完成的任务:
-
- ストレージの設定
- Helm を使う
Yaml 语法
-
- 先頭が – で始まるとリスト。[x, y, z] の形式もリスト
-
- 途中 : があると辞書。{x: a, y: b, z: c} の形式もリスト
- # より後ろはコメント
请提供一个上下文以便我能准确地为您提供中国的翻译。
-
- Docker/Kubernetes 実践コンテナ開発入門
- Kubernetes Tutorial