IP 主机名 节点 192.168.117.14 master master节点 192.168.117.15 node node节点 192.168.117.16 node2 新增节点
环境准备(所有节点)
配置主机映射
[ root@master ~]
192.168.117.14 master
192.168.117.15 node
192.168.117.16 node2
关闭Swap
[ root@master ~]
[ root@master ~]
配置时间同步
master节点:
[ root@master ~]
[ root@master ~]
[ root@master ~]
local stratum 10
server master iburst
allow all
[ root@master ~]
[ root@master ~]
[ root@master ~]
node节点:
[ root@node ~]
[ root@node ~]
[ root@node ~]
server 192.168.117.14 iburst
[ root@node ~]
[ root@node ~]
配置路由转发
[ root@master ~]
[ root@master ~]
[ root@master ~]
[ root@master ~]
[ root@master ~]
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
配置IPVS
[ root@master ~]
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
[ root@master ~]
[ root@master ~]
安装ipset软件包
[ root@master ~]
添加阿里云yum源并安装Docker,执行提供的kubernetes_base.sh脚本获取镜像
[ root@master ~]
[ root@master ~]
[ root@master ~]
[ root@master ~]
[ root@master ~]
[ root@master ~]
[ root@master ~]
[ root@master ~]
{
"exec-opts" :[ "native.cgroupdriver=systemd" ]
}
[ root@master ~]
[ root@master ~]
[ root@master ~]
[ root@master ~]
[ root@master ~]
配置Kubernetes yum源
[ root@master ~]
[ kubernetes]
name= Kubernetes
baseurl= https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled= 1
gpgcheck= 1
repo_gpgcheck= 1
gpgkey= https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
安装Kubernetes工具并启动Kubelet
[ root@master ~]
[ root@master ~]
案例实施
部署wordpress应用
进入master节点,初始化Kubernetes集群
[ root@master ~]
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.117.14:6443 --token w8ybfg.qhsi4tvrrhk2h2xz \
--discovery-token-ca-cert-hash sha256:575ddcd924f82ace0768212c175a593a198cfde5e23f972d06cec875eded0d27
拷贝config配置文件
[ root@master ~]
[ root@master ~]
用提供的kube-flannel.yml文件安装网络
[ root@master ~]
在两个node节点上加入集群
[ root@node ~]
--discovery-token-ca-cert-hash sha256:575ddcd924f82ace0768212c175a593a198cfde5e23f972d06cec875eded0d27
创建Pod
[ root@master ~]
apiVersion: v1
kind: Pod
metadata:
name: pod-test
labels:
os: centos
spec:
containers:
- name: hello
image: nginx:latest
imagePullPolicy: Never
env:
- name: Test
value: "123456"
command: [ "bash" ,"-c" ,"while true;do date;sleep 1;done" ]
[ root@master ~]
查看Pod状态
[ root@master ~]
NAME READY STATUS RESTARTS AGE
pod-test 1/1 Running 0 27m
新建一个命名空间以及Deployment对象
[ root@master ~]
[ root@master ~]
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: mysql-deploy
namespace: blog
labels:
app: mysql
spec:
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.6
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
name: dbport
env:
- name: MYSQL_ROOT_PASSWORD
value: rootPassWord
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
value: wordpress
- name: MYSQL_PASSWORD
value: wordpress
volumeMounts:
- name: db
mountPath: /var/lib/mysql
volumes:
- name: db
hostPath:
path: /var/lib/mysql
---
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: blog
spec:
selector:
app: mysql
ports:
- name: mysqlport
protocol: TCP
port: 3306
targetPort: dbport
[ root@master ~]
查看Service的详细情况
[ root@master ~]
Name: mysql
Namespace: blog
Labels: < none>
Annotations: < none>
Selector: app= mysql
Type: ClusterIP
IP: 10.106.156.104
Port: mysqlport 3306/TCP
TargetPort: dbport/TCP
Endpoints: 192.188.1.3:3306
Session Affinity: None
Events: < none>
创建Wordpress服务
[ root@master ~]
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: wordpress-deploy
namespace: blog
labels:
app: wordpress
spec:
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: wdport
env:
- name: WORDPRESS_DB_HOST
value: 10.106.156.104:3306 //对应mysql服务的clusterIP
- name: WORDPRESS_DB_USER
value: wordpress
- name: WORDPRESS_DB_PASSWORD
value: wordpress
---
apiVersion: v1
kind: Service
metadata:
name: wordpress
namespace: blog
spec:
type: NodePort
selector:
app: wordpress
ports:
- name: wordpressport
protocol: TCP
port: 80
targetPort: wdport
[ root@master ~]
创建wordpress-pod
[ root@master ~]
apiVersion: v1
kind: Pod
metadata:
name: wordpress
namespace: blog
spec:
containers:
- name: wordpress
image: wordpress
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: wdport
env:
- name: WORDPRESS_DB_HOST
value: localhost:3306
- name: WORDPRESS_DB_USER
value: wordpress
- name: WORDPRESS_DB_PASSWORD
value: wordpress
- name: mysql
image: mysql:5.6
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
name: dbport
env:
- name: MYSQL_ROOT_PASSWORD
value: rootPassWord
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
value: wordpress
- name: MYSQL_PASSWORD
value: wordpress
volumeMounts:
- name: db
mountPath: /var/lib/mysql
volumes:
- name: db
hostPath:
path: /var/lib/mysql
[ root@master ~]
查看服务信息
[ root@master ~]
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT( S) AGE
mysql ClusterIP 10.106.156.104 < none> 3306/TCP 6m8s
wordpress NodePort 10.98.162.136 < none> 80:30861/TCP 34s
浏览器访问wordpress应用
Node的隔离与恢复
隔离node节点/恢复node节点调度
[ root@master ~]
[ root@master ~]
NAME STATUS ROLES AGE VERSION
master Ready master 5d3h v1.14.1
node Ready,SchedulingDisabled < none> 5d3h v1.14.1
node2 Ready < none> 14h v1.14.1
[ root@master ~]
[ root@master ~]
NAME STATUS ROLES AGE VERSION
master Ready master 5d3h v1.14.1
node Ready < none> 5d3h v1.14.1
node2 Ready < none> 14h v1.14.1
Pod动态扩容和缩放
运行Deployment
[ root@master ~]
kubectl run --generator= deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator= run-pod/v1 or kubectl create instead.
deployment.apps/nginx created
Pod扩容,将Nginx Deployment控制的Pod副本数量从初始的1扩容至5
[ root@master ~]
deployment.extensions/nginx scaled
Pod缩容,将Nginx Deployment控制的Pod副本数量从5缩容至2
[ root@master ~]
deployment.extensions/nginx scaled
将Pod调度到指定的Node
添加/删除标签
[ root@master ~]
node/node labeled
[ root@master ~]
node/node labeled
调度Pod到指定Node节点
[ root@master ~]
[ root@master ~]
apiVersion: v1
kind: ReplicationController
metadata:
name: memcached-gcxt
labels:
name: memcached-gcxt
spec:
replicas: 1
selector:
name: memcached-gcxt
template:
metadata:
labels:
name: memcached-gcxt
spec:
containers:
- name: memcached-gcxt
image: memcached
command:
- memcached
- -m 64
ports:
- containerPort: 11211
nodeSelector:
project: gcxt
[ root@master ~]
查看Pod,可以看到Pod被调度到node节点
[ root@master ~]
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
memcached-gcxt-d5r4r 1/1 Running 0 23m 192.188.2.2 node < none> < none>
应用滚动升级
启动Deployment
[ root@master ~]
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: httpd
spec:
replicas: 3
template:
metadata:
labels:
run: httpd
spec:
containers:
- name: httpd
image: httpd:2.2.31
ports:
- containerPort: 80
[ root@master ~]
查看Pod和Deployment状态
[ root@master ~]
NAME READY STATUS RESTARTS AGE
httpd-5ddb558f47-cg6rc 1/1 Running 0 62s
httpd-5ddb558f47-tpzl5 1/1 Running 0 62s
httpd-5ddb558f47-ts7mf 1/1 Running 0 62s
pod-test 1/1 Running 6 2d16h
[ root@master ~]
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd 3/3 3 3 80s httpd httpd:2.2.31 run= httpd
滚动升级,将httpd.yaml配置文件中的httpd版本改为2.2.32,再次启动
[ root@master ~]
image: httpd:2.2.32
[ root@master ~]
查看Deployment的详细信息,其中的日志信息描述了滚动升级的过程
[ root@master ~]
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 5m5s deployment-controller Scaled up replica set httpd-5ddb558f47 to 3
Normal ScalingReplicaSet 66s deployment-controller Scaled up replica set httpd-8bdffc6d8 to 1
Normal ScalingReplicaSet 64s deployment-controller Scaled down replica set httpd-5ddb558f47 to 2
Normal ScalingReplicaSet 64s deployment-controller Scaled up replica set httpd-8bdffc6d8 to 2
Normal ScalingReplicaSet 63s deployment-controller Scaled down replica set httpd-5ddb558f47 to 1
Normal ScalingReplicaSet 63s deployment-controller Scaled up replica set httpd-8bdffc6d8 to 3
Normal ScalingReplicaSet 61s deployment-controller Scaled down replica set httpd-5ddb558f47 to 0
创建3个配置文件,唯一不同之处是镜像的版本号
[ root@master ~]
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: httpd
spec:
revisionHistoryLimit: 10
replicas: 3
template:
metadata:
labels:
run: httpd
spec:
containers:
- name: httpd
image: httpd:2.2.16
ports:
- containerPort: 80
[ root@master ~]
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: httpd
spec:
revisionHistoryLimit: 10
replicas: 3
template:
metadata:
labels:
run: httpd
spec:
containers:
- name: httpd
image: httpd:2.2.17
ports:
- containerPort: 80
[ root@master ~]
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: httpd
spec:
revisionHistoryLimit: 10
replicas: 3
template:
metadata:
labels:
run: httpd
spec:
containers:
- name: httpd
image: httpd:2.2.18
ports:
- containerPort: 80
部署Deployment
[ root@master ~]
deployment.apps/httpd configured
[ root@master ~]
deployment.apps/httpd configured
[ root@master ~]
deployment.apps/httpd configured
查看Deployment
[ root@master ~]
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd 3/3 1 3 8m28s httpd httpd:2.2.18 run= httpd
查看revision历史记录
[ root@master ~]
deployment.extensions/httpd
REVISION CHANGE-CAUSE
1 < none>
2 < none>
3 kubectl apply --filename= httpd.v1.yaml --record= true
4 kubectl apply --filename= httpd.v2.yaml --record= true
5 kubectl apply --filename= httpd.v3.yaml --record= true
回滚到指定版本revision 1
[ root@master ~]
deployment.extensions/httpd rolled back
[ root@master ~]
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd 3/3 3 3 10m httpd httpd:2.2.31 run= httpd
再次查看revision历史记录,可以看到revision记录也相应增加
[ root@master ~]
deployment.extensions/httpd
REVISION CHANGE-CAUSE
2 < none>
3 kubectl apply --filename= httpd.v1.yaml --record= true
4 kubectl apply --filename= httpd.v2.yaml --record= true
5 kubectl apply --filename= httpd.v3.yaml --record= true
6 < none>