1. [关闭 防火墙]
  2. # systemctl disable firewalld
  3. # systemctl stop firewalld

安装 etcd kubernetes docker

  1. [安装]
  2. yum install -y etcd kubernetes # 安装etcd和kubernetes软件(会自动安装docker)

修改配置

  1. [Docker配置文件 /etc/sysconfig/docker]
  2. => OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
  3. [Kubernetes apiservce配置文件 /etc/kubernetes/apiserver]
  4. => admission_control参数 -> ServiceAccount删除

k8s -  单机版安装 - 图1

启动服务

  1. # systemctl start etcd
  2. # systemctl start docker
  3. # systemctl start kube-apiserver
  4. # systemctl start kube-controller-manager
  5. # systemctl start kube-scheduler
  6. # systemctl start kubelet
  7. # systemctl start kube-proxy

案例 - 部署nginx服务

$ kubectl run my-nginx --image=nginx --port=80

$ kubectl get pod  # 查看pod

pod 处于pending -> READY字段一直是0/1, 服务部署失败的原因是”中国墙“的问题导致无法下载pod启动时需要的谷歌镜像,所以我们得间接的创建所需的镜像。

补充: Pending状态表示API Server已经创建Pod,但Pod内还有一个或者多个容器没有创建,或者正在下载镜像的过程。详细的参考Pod声明周期和重启策略

# 创建gcr.io/google_containers/pause-amd64:3.0镜像

$ docker pull googlecontainer/pause-amd64:3.0

$ docker tag googlecontainer/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0

配置文件管理服务

配置Yaml文件

# vi nginx.yaml

piVersion: extensions/v1beta1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 3
template:
  metadata:
    labels:
      app: nginx
  spec:
    containers:
    - name: nginx
      image: nginx:1.7.9
      ports:
      - containerPort: 80

启动管理服务

# 根据yaml文件创建服务

$ kubectl create -f nginx.yaml 
deployment "my-nginx" created

# 查看deployment

$ kubectl get deployments
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
my-nginx   3         3         3            3           6s

# 查看Pod

$ kubectl get pod
NAME                        READY     STATUS    RESTARTS   AGE
my-nginx-4087004473-dtrjp   1/1       Running   0          7s
my-nginx-4087004473-jz80p   1/1       Running   0          7s
my-nginx-4087004473-wh576   1/1       Running   0          7s

# 根据yaml文件删除服务

$ kubectl delete -f nginx.yaml 
deployment "my-nginx" deleted

$ kubectl get pod
No resources found.
$ kubectl get deployment
No resources found.

Service

[部署一个nginx服务]

$ kubectl run my-nginx --image=nginx --port=80

# 创建一个service 且将其暴露到集群外可供访问

$ kubectl expose deployment/my-nginx --type="NodePort" --port 80
service "my-nginx" exposed

# 此时service列表多个my-nginx服务

$ kubectl get services
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   10.254.0.1       <none>        443/TCP        7d
my-nginx     10.254.255.103   <nodes>       80:32589/TCP   7s

k8s -  单机版安装 - 图2

deployments

# 运行nginx镜像
$ kubectl run my-nginx --image=nginx --port=80
# 交互式 shell 的方式运行 pod
$ kubectl run -i --tty my-nginx --image=nginx --port=80 -- sh
# 链接到运行中的容器
$ kubectl attach my-nginx-532658988-10kxd -i

# 查看deployment
$ kubectl get deployments
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
my-nginx   1         1         1            1           25m
# 扩展10个副本
$ kubectl scale deployment my-nginx --replicas=10
deployment "my-nginx" scaled
$ kubectl scale  deployment/my-nginx --replicas=10 # 作用效果等同上一条命令 
deployment "my-nginx" scaled
# 再次显示deployment
$ kubectl get deployments
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
my-nginx   10        10        10           1           26m
$ kubectl get pods
NAME                       READY     STATUS    RESTARTS   AGE
my-nginx-379829228-38hkg   1/1       Running   0          5m
my-nginx-379829228-7j15l   1/1       Running   0          31m
my-nginx-379829228-c8mt3   1/1       Running   0          5m
my-nginx-379829228-f6mm8   1/1       Running   0          5m
my-nginx-379829228-q1rj0   1/1       Running   0          5m
my-nginx-379829228-qg7lf   1/1       Running   0          5m
my-nginx-379829228-rjfbq   1/1       Running   0          5m
my-nginx-379829228-v581r   1/1       Running   0          5m
my-nginx-379829228-wh49w   1/1       Running   0          5m
my-nginx-379829228-wpn98   1/1       Running   0          5m

# 缩扩到1个副本
$ kubectl scale  deployment/my-nginx --replicas=1
deployment "my-nginx" scaled
$ kubectl scale deployment my-nginx --replicas=1   # 作用效果等同上一条命令

deployment的更新回滚

$ kubectl create -f nginx.yaml
$ kubectl get pod
NAME                        READY     STATUS    RESTARTS   AGE
my-nginx-4087004473-4xj74   1/1       Running   0          3m
my-nginx-4087004473-jkptq   1/1       Running   0          3m
my-nginx-4087004473-m55s1   1/1       Running   0          3m
$ kubectl get deployment
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
my-nginx   3         3         3            3           4m
# 更新应用的镜像从1.7.9版本——>1.9.1
$ kubectl set image deployment/my-nginx nginx=nginx:1.9.1
deployment "my-nginx" image updated
# 确认是否更新成功
$ kubectl rollout status deployment/my-nginx
deployment "my-nginx" successfully rolled out
# 回滚到上一代版本
$ kubectl rollout undo deployment/my-nginx
deployment "my-nginx" rolled back

ConfigMap-容器应用的配置管理

[以yaml文件方式创建ConfigMap]

# vi special-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm

# vi env-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
  namespace: default
data:
  log_level: INFO

# vi configMap.yaml

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: nginx
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: SPECIAL_LEVEL_KEY   #定义环境变量名称
          valueFrom:       #key"special.how"对应的值
            configMapKeyRef:
              name: special-config #环境变量的值
              key: special.how
        - name: SPECIAL_TYPE_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: special.type
  restartPolicy: Never
$ kubectl create -f special-config.yaml
configmap "special-config" created
$ kubectl create -f env-config.yaml
configmap "env-config" created
# 查看ConfigMap
$ kubectl get configmaps
NAME             DATA      AGE
env-config       1         38m
special-config   2         39m
# 让我们看一下创建的ConfigMap
$  kubectl describe configmap env-config
Name:       env-config
Namespace:  default
Labels:     <none>
Annotations:    <none>

Data
====
log_level:  4 bytes

# 查看ConfigMap键的值
$ kubectl get configmaps env-config -o yaml
apiVersion: v1
data:
  log_level: INFO
kind: ConfigMap
metadata:
  creationTimestamp: 2017-11-30T07:29:49Z
  name: env-config
  namespace: default
  resourceVersion: "285268"
  selfLink: /api/v1/namespaces/default/configmaps/env-config
  uid: 3f473adf-d5a0-11e7-9830-0800275ae9e7
$ kubectl create -f configMap.yaml
pod "dapi-test-pod" created
# 查看pod,状态ContainerCreating
$ kubectl get pod
NAME            READY     STATUS              RESTARTS   AGE
dapi-test-pod   0/1       ContainerCreating   0          3s
# 隔一段时间再查看pod,发现并没有返回什么
$  kubectl get pod
# 显示所有的权限查看pod
$ kubectl get pod --show-all
NAME            READY     STATUS      RESTARTS   AGE
dapi-test-pod   0/1       Completed   0          1m
# 查看详情
$ kubectl describe pod dapi-test-pod
Name:       dapi-test-pod
Namespace:  default
Node:       127.0.0.1/127.0.0.1
Start Time: Thu, 30 Nov 2017 15:32:00 +0800
Labels:     <none>
Status:     Succeeded
IP:     
Controllers:    <none>
Containers:
  test-container:
    Container ID:   docker://1ba533f43ee60c02e03dafb7bcb8495fc12264aaab229872df0b289a3c1b9976
    Image:      nginx
    Image ID:       docker-pullable://docker.io/nginx@sha256:b81f317384d7388708a498555c28a7cce778a8f291d90021208b3eba3fe74887
    Port:       
    Command:
      /bin/sh
      -c
      env
    State:      Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Thu, 30 Nov 2017 15:32:25 +0800
      Finished:     Thu, 30 Nov 2017 15:32:25 +0800
    Ready:      False
    Restart Count:  0
    Volume Mounts:  <none>
    Environment Variables:
      SPECIAL_LEVEL_KEY:    <set to the key 'special.how' of config map 'special-config'>
      SPECIAL_TYPE_KEY:     <set to the key 'special.type' of config map 'special-config'>
Conditions:
  Type      Status
  Initialized   True 
  Ready     False 
  PodScheduled  True 
No volumes.
QoS Class:  BestEffort
Tolerations:    <none>
Events:
  FirstSeen LastSeen    Count   From            SubObjectPath           Type        Reason          Message
  --------- --------    -----   ----            -------------           --------    ------          -------
  3m        3m      1   {default-scheduler }                    Normal      Scheduled       Successfully assigned dapi-test-pod to 127.0.0.1
  3m        3m      1   {kubelet 127.0.0.1} spec.containers{test-container} Normal      Pulling         pulling image "nginx"
  3m        2m      2   {kubelet 127.0.0.1}                 Warning     MissingClusterDNS   kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
  2m        2m      1   {kubelet 127.0.0.1} spec.containers{test-container} Normal      Pulled          Successfully pulled image "nginx"
  2m        2m      1   {kubelet 127.0.0.1} spec.containers{test-container} Normal      Created         Created container with docker id 1ba533f43ee6; Security:[seccomp=unconfined]
  2m        2m      1   {kubelet 127.0.0.1} spec.containers{test-container} Normal      Started         Started container with docker id 1ba533f43ee6
# 可知container started 成功,进一步查看日志
$ docker logs 1ba
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.254.0.1:443
MY_SERVICE_PORT_80_TCP=tcp://10.254.110.249:80
MY_SERVICE_PORT_443_TCP_ADDR=10.254.110.249
HOSTNAME=dapi-test-pod
MY_SERVICE_PORT_443_TCP_PORT=443
HOME=/root
MY_SERVICE_PORT_443_TCP_PROTO=tcp
MY_SERVICE_SERVICE_PORT_HTTP=80
SPECIAL_TYPE_KEY=charm
MY_SERVICE_SERVICE_PORT_HTTPS=443
MY_SERVICE_PORT_443_TCP=tcp://10.254.110.249:443
MY_SERVICE_SERVICE_HOST=10.254.110.249
KUBERNETES_PORT_443_TCP_ADDR=10.254.0.1
NGINX_VERSION=1.13.7-1~stretch
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
NJS_VERSION=1.13.7.0.1.15-1~stretch
KUBERNETES_PORT_443_TCP_PROTO=tcp
MY_SERVICE_SERVICE_PORT=80
MY_SERVICE_PORT=tcp://10.254.110.249:80
SPECIAL_LEVEL_KEY=very
MY_SERVICE_PORT_80_TCP_ADDR=10.254.110.249
KUBERNETES_PORT_443_TCP=tcp://10.254.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.254.0.1
MY_SERVICE_PORT_80_TCP_PORT=80
PWD=/
MY_SERVICE_PORT_80_TCP_PROTO=tcp