跳至主要內容

K8S实战

知识库容器技术kubernetes实战kubernetes大约 3 分钟

快速入门

  • 无状态服务:

    就是没有特殊状态的服务,各个请求对于服务器来说统一无差别处理,请求自身携带了所有服务端所需要的所有参数。

    没有要实时保存的数据。
  • 有状态服务:

    与之相反,有状态服务在服务端保留之前请求的信息,用以处理当前请求。例如:MySQL
常用命令
# 通过get node操作获取集群节点信息。
kubectl get node
# 创建pod ikubernetes/myapp2:v0.7是官方提供的demo镜像
#kubectl run nginx-svc --image=nginx:latest --port=80  # nginx镜像
kubectl run my-app --image=ikubernetes/myapp2:v0.7 --port=80
# 查看Deployment组件
kubectl get deployment
# 查看ReplicaSet组件
kubectl get rs
# 查看POD组件
kubectl get pod
kubectl get pod -o wide
kubectl get pod --all-namespaces
# 删除部门的应用
kubectl delete deployment my-app
# 删除全部应用
kubectl delete deployment --all
kubectl delete rs --all
kubectl delete pod --all
# 扩容
kubectl scale deployment my-app --replicas=3
# 创建service(复制均衡和服务的发现)
kubectl expose deployment my-app --target-port=80 --port=80
# 查看service组件
kubectl get svc
kubectl get svc -o wide
kubectl describe service my-app
# 查看默认是轮询规则
curl 10.100.127.104
# 可查看负载负载均衡执行情况
curl 10.100.127.104/hostname
# 此时外网还访问不到service,需要配置iptabels的转发规则或者ssh的转发
# ssh端口转发(本地执行)
ssh -L 7777:10.111.63.238:80 root@192.16.18.111
# 输入root密码验证,在不登出的情况下。本地访问 http://localhost:7777 即可

# iptables端口转发(存在问题,那位大神可以指点一二)
# 开启允许转发
sysctl -w net.ipv4.ip_forward=1

# 清除iptables nat
iptables -t nat -F
# 查看现用所有iptables规则
iptables -t nat -L -n --line-number
# 添加端口转发规则
# 规则解释:在forward表里添加规则,允许转发向6666端口转发的tcp连接数据
iptables -I FORWARD -p tcp --dport 6666 -j ACCEPT
iptables -t nat -I PREROUTING -p tcp --dport 6666 -j DNAT --to-destination 10.111.63.238:80
iptables -t nat -I POSTROUTING -p tcp --dport 80 -j MASQUERADE
service iptables save
service iptables restart

iptables -t nat -A OUTPUT -p tcp --dport 6666  -j DNAT --to-destination 10.111.63.238:80
iptables -t nat -A PREROUTING -p tcp --dport 6666 -j DNAT --to-destination 10.111.63.238:80
iptables -t nat -A POSTROUTING -p tcp -d 10.111.63.238   --dport 80 -j SNAT --to-source 192.16.18.111

# 查看ip的映射规则
ipvsadm -Ln
# 查看apiVersion
kubectl api-versions

指令部署

# 创建doploymnet
kubectl run my-app --image=ikubernetes/myapp2:v0.7 --port=80
# 扩容为3个pod
kubectl scale deployment my-app --replicas=3
# 创建service 默认service.type=ClusterIP(外网不可以直接访问) LoadBalancer外网可以直接访问
kubectl expose deployment my-app --type=LoadBalancer --name=my-app-service
#kubectl expose deployment my-app --target-port=80 --port=80 --name=my-app-service
# 查看service
kubectl get svc

[root@k8s-master-111 ~]# kubectl get svc
NAME                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
my-app-service   LoadBalancer   10.105.63.149    <pending>     8080:32622/TCP   53m

curl 192.16.18.111:32622

# 删除
kubectl delete svc my-app-service
kubectl delete deployment my-app

Yaml 部署

my-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-nginx
      release: stable
  template:
    metadata:
      labels:
        app: my-nginx
        release: stable
        env: test
    spec:
      containers:
      - name: my-nginx
        image: nginx:latest
        ports:
        - name: http
          containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  namespace: default
spec:
  type: NodePort
  selector:
    app: my-nginx
    release: stable
  ports:
    - name: http
      port: 80
      targetPort: 80
kubectl create -f my-nginx.yaml

配置 ingess 域名访问

my-app-ingess.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-my-app
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: myapp.k8s.com
    http:
      paths:
      - path:
        backend:
          serviceName: my-app
          servicePort: 80
kubectl apply -f my-nginx-ingess.yaml
kubectl get ingress
# 需要修改本地hosts文件
curl http://myapp.k8s.com

配置 k8s 拉取私有仓库镜像

k8s 在默认情况下,只能拉取 harbor 镜像仓库的公有镜像,如果拉取私有仓库镜像,则是会报 ErrImagePull 和 ImagePullBackOff 的错误

docker login 192.168.1.180:8077
## 生成`.docker/config.json`
cat ~/.docker/config.json
## 对秘钥文件进行base64加密
cat /root/.docker/config.json | base64 -w 0
# ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjEuMTgwOjgwNzciOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9Cn0=
## 创建docker-secret.yaml
cat > docker-secret.yaml <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: docker-login
type: kubernetes.io/dockerconfigjson
data:
  .dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjEuMTgwOjgwNzciOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9Cn0=
EOF
## 创建应用
kubectl create -f docker-secret.yaml -n default