k8s使用笔记

2020/07/19 posted in  服务端
Tags:  #docker #linux #shell #test

k8s全称kerbernets,docker集群的工具

安装k8s

首先得有docker环境,安装完之后继续下一步

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

设置好数据源之后
安装指定的

 yum -y install kubelet-1.17.0 kubeadm-1.17.0

以上操作,从机也要进行下载

systemctl enable docker && systemctl start docker
systemctl enable kubelet && systemctl start kubelet

启动docker与kubelet服务

每个机器设置一下hostname

hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-slave01
hostnamectl set-hostname k8s-slave02
有便于后面的区分

k8s的核心思想

node pods deployment service

新建命令空间

新建namespce.yaml文件

apiVersion: v1
kind: Namespace
metadata:
  name: work

deployment

搭建swagger-ui作演示
swagger-ui-deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: swagger-ui
  name: swagger-ui
  namespace: work
spec:
  selector:
    matchLabels:
      app: swagger-ui
  replicas: 1
  template:
    metadata:
      labels:
        app: swagger-ui
    spec:
      containers:
      - env:
        image: swaggerapi/swagger-ui
        name: swagger-ui
        volumeMounts:
          - mountPath: /usr/share/nginx/html/config
            name: doc-volume
        ports:
        - containerPort: 8080
      volumes:
        - name: doc-volume
          hostPath:
            # directory location on host
            path: /webwww/swagger
            # this field is optional
            type: Directory

service

以swagger作演示
swagger-ui-service.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: swagger-ui
  name: swagger-ui
  namespace: work
spec:
  selector:
    matchLabels:
      app: swagger-ui
  replicas: 1
  template:
    metadata:
      labels:
        app: swagger-ui
    spec:
      containers:
      - env:
        image: swaggerapi/swagger-ui
        name: swagger-ui
        volumeMounts:
          - mountPath: /usr/share/nginx/html/config
            name: doc-volume
        ports:
        - containerPort: 8080
      volumes:
        - name: doc-volume
          hostPath:
            # directory location on host
            path: /webwww/swagger
            # this field is optional
            type: Directory

相关命令

查看work命令空间所有的pods
kubectl get pods -n work

查看相关节点
kubectl get nodes

制作pods集
kubectl create -f swagger-ui-deployment.yaml

查看指定pod相关信息
kubectl describe pods swagger-ui-c69f9f4cf-kbft9 -n work
查看指定pod详细信息
kubectl describe pods swagger-ui-c69f9f4cf-kbft9 -n work

制作service暴露外部
kubectl apply -f swagger-ui-service.yaml

删除指定的service
kubectl delete -f swagger-ui-service.yaml

查看有哪些service
kubectl get svc -n work

更新相关配置
kubectl replace -f nginx.yaml

进入指定pods
kubectl -n work exec -it gitlab-67f74459f4-qdqtf /bin/bash

注意点

Pod并非一个持久化的东西,很有可能突然挂了,并且没有能力自我修复,这就是为啥我们把它们和controller一起用,这样可以来控制pod的replica,容错,自我修复等等。比较有名的例子比如Deployments,ReplicaSets等。我们通过把Pod的定义(specification,也就是spec)附加到别的对象(也就是之前用的template.spec)来完成。

k8s会有两个默认Namespace:kube-system和default。kube-system一般会用来放一些Kubernetes系统的组件,default会用来放一些属于其它Namespace的对象。我们默认情况下是会连接到default命名空间。kube-public是一个特殊的namespace,可以被所有的用户读,一般用于特殊情况比如初始化一个集群。

Docker 启动时可以用 --publish/-p 参数配置端口映射规则,Pod 的定义设置容器的映射规则如:

apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: "nginx:1.11"
ports:
- name: web
containerPort: 80
protocol: TCP
hostIP: 0.0.0.0
hostPort: 80
name:设置端口名称,必须 Pod 内唯一,当只配置一个端口的时候,这是一个可选项,当配置多个端口的时候,这是一个必须项。
containerPort:必须项,设置在容器内的端口,有效范围 1 ~ 65535。
protocol:可选项,设置端口的协议,TCP 或者 UDP,默认是 TCP。
hostIP:可选项,是指在宿主机上的IP,默认绑定到所有可用的 IP 上,即 0.0.0.0 。
hostPort:可选项,设置在宿主机上的端口,如果设置则进行端口映射,有效范围 1 ~ 65535。

总结

总的来说相对复制,生产上使用必须要把核心理解清楚。

相关阅读

安装k8s
k8s增减node

kubectl delete pod 后又创建了一个新的pod

1 node(s) had taints that the pod didn't tolerate.
有时候一个pod创建之后一直是pending,没有日志,也没有pull镜像,describe的时候发现里面有一句话: 1 node(s) had taints that the pod didn't tolerate.

直译意思是节点有了污点无法容忍,执行 kubectl get no -o yaml | grep taint -A 5 之后发现该节点是不可调度的。这是因为kubernetes出于安全考虑默认情况下无法在master节点上部署pod,于是用下面方法解决:

kubectl taint nodes --all node-role.kubernetes.io/master-
https://my.oschina.net/eima/blog/1860598
https://kubernetes.io/zh/docs/concepts/services-networking/connect-applications-service/