Kubernetes运维(下)
# Kubernetes运维(下)
# 【题目1】服务部署Jenkins
在Kubernetes集群default命名空间下完成Jenkins的部署,使用镜像jenkins/jenkins:latest,Deployment和Service名称均为jenkins,要求以NodePort方式将Jenkins的8080端口对外暴露为30880,并完成离线插件的安装。部署完成后设置Jenkins用户名为jenkins;密码为000000,并在授权策略中配置“任何用户可以做任何事(没有任何限制)”。
完成后提交master节点的用户名、密码和IP地址到答题框。(需要用到的软件包路径http:///Jenkins.tar.gz)
apiVersion: v1
kind: Service
metadata:
name: jenkins
labels:
app: jenkins
spec:
type: NodePort
ports:
- name: http
port: 8080 #服务端口
targetPort: 8080
nodePort: 30080 #NodePort方式暴露 Jenkins 端口
- name: jnlp
port: 50000 #代理端口
targetPort: 50000
#nodePort: 50000
selector:
app: jenkins
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
labels:
app: jenkins
spec:
selector:
matchLabels:
app: jenkins
replicas: 1
template:
metadata:
labels:
app: jenkins
spec:
nodeSelector:
kubernetes.io/hostname: node
serviceAccountName: default
containers:
- name: jenkins
#command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]
image: registry.cn-shanghai.aliyuncs.com/mydlq/jenkins:2.240
securityContext:
runAsUser: 0 #设置以ROOT用户运行容器
privileged: true #拥有特权
ports:
- name: http
containerPort: 8080
- name: jnlp
containerPort: 50000
resources:
limits:
memory: 2Gi
cpu: "1000m"
requests:
memory: 1Gi
cpu: "500m"
volumeMounts: #设置要挂在的目录
- name: data
mountPath: /var/jenkins_home
volumes:
- name: data
persistentVolumeClaim:
claimName: 11131-pvc #设置PVC
# 【题目2】服务部署GitLab
在Kubernetes集群default命名空间下完成GitLab的部署,使用镜像gitlab/gitlab-ce:latest,Deployment和Service名称均为gitlab,要求在Deployment资源清单文件中设置GitLab的root用户密码为admin123,并以NodePort方式将GitLab的80端口对外暴露为30888。部署完成后新建公开项目springcloud,并将springcloud文件夹中的代码上传到该项目。
完成后提交master节点的用户名、密码和IP地址到答题框。(需要用到的软件包路径http:///Jenkins.tar.gz)
# 【题目3】Pod时间同步
容器默认的时区采用的是UTC时区,而宿主机采用的是CST时区。使用nginx:latest镜像在default命名空间下创建一个名为exam的Pod,要求Pod时区与宿主机时区同步。
完成后提交master节点的IP、用户名和密码到答题框。
apiVersion: v1
kind: Pod
metadata:
name: exam
spec:
containers:
- name: exam
image: nginx:latest
volumeMounts:
- mountPath: /etc/localtime
name: timezone
volumes:
- name: timezone
hostPath:
path: /etc/localtime
# 【题目4】网络策略
创建一个网络策略network-exam,要求只有internal命名空间下的Pod可以通过TCP协议的8080端口访问到mysql命名空间下的Pod。
完成后提交master节点的IP、用户名和密码到答题框。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: network-exam
namespace: internal
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
# 满足允许mysql命名空间中的pod访问
- from:
- namespaceSelector:
matchLabels:
ns: internal
ports:
- protocol: TCP
port: 8080
# 【题目5】RBAC
创建一个名为deployment-clusterrole的clusterrole,并且对该clusterrole只绑定对Deployment、Daemonset、Statefulset的创建权限。在指定命名空间exam创建一个名为exam-user的serviceaccount,并且将上一步创建clusterrole和该serviceaccount绑定。完成后提交master节点的用户名、密码和IP地址到答题框。
[root@master ~]# kubectl create clusterrole deploymnet-clusterrole --verb=create --resource=deployment,daemonsets,statefulsets
[root@master ~]# kubectl create serviceaccount exam-user -n exam
[root@master ~]# kubectl create rolebinding cicd-token --serviceaccount=exam:exam-user --clusterrole=deployment-clusterrole -n exam
# 【题目6】Pod启动策略
在default命名空间下使用nginx:latest镜像创建一个名为lifecycle-demo的Pod,要求容器创建成功后执行命令“echo Hello from the postStart handler > /usr/share/message”,容器终止前执行命令“nginx -s quit; while killall -0 nginx; do sleep 1; done”。
完成后提交master节点的IP、用户名和密码到答题框。
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
preStop:
exec:
command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]
# 【题目7】注入变量
在default命名空间下使用nginx:latest镜像启动一个名为env-demo的Pod,为该Pod的容器配置环境变量DEMO_GREETING,其值为“Hello from the environment”。
完成后提交master节点的IP、用户名和密码到答题框。
apiVersion: v1
kind: Pod
metadata:
name: env-demo
spec:
containers:
- name: env-demo
image: nginx:latest
env:
- name: DEMO_GREETING
value: "Hello from the environment"
# 【题目8】API自定义资源
创建一个自定义API资源exam,API资源类型为Scaling,作用域为命名空间。
完成后提交master节点的用户名、密码和IP地址到答题框。
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: exam.stable.example.com
spec:
group: stable.example.com
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
scope: Namespaced
names:
plural: exam
singular: exam
kind: Scaling