003-OpenShift Web运维

OpenShift Web控制台部署运维实战总结

1. 概述

OpenShift Web控制台是OpenShift容器平台的核心管理界面,提供:

  • 集群资源的可视化管理和监控
  • 应用部署、扩展和生命周期管理
  • 开发人员自助服务门户
  • 多集群管理能力(4.6+版本)

2. 部署实战

2.1 前置条件

1
2
3
4
5
6
# 验证集群状态
oc get clusterversion
oc get nodes

# 检查控制台Operator状态
oc get clusteroperator console

2.2 部署流程

  1. Operator安装(若未自动安装):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
oc apply -f - <<EOF
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
name: console-operator
namespace: openshift-console
spec:
targetNamespaces:
- openshift-console
EOF

oc apply -f - <<EOF
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: console-operator
namespace: openshift-console
spec:
channel: stable
name: console-operator
source: redhat-operators
sourceNamespace: openshift-marketplace
EOF
  1. 自定义配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# console-config.yaml
apiVersion: operator.openshift.io/v1
kind: Console
metadata:
name: cluster
spec:
customization:
# 自定义企业主题
customLogoFile:
key: logo.svg
name: custom-logo
customProductName: "企业容器云平台"
# 控制台超时配置(分钟)
logoutRedirect: "https://example.com/logout"
providers:
# 配置OIDC身份提供者
oidc:
- clientID: console-app
clientSecret:
name: console-oidc-secret
issuer: https://sso.example.com/auth/realms/master
  1. 应用配置
1
oc apply -f console-config.yaml

2.3 验证部署

1
2
3
4
5
6
7
8
# 检查Pod状态
oc get pods -n openshift-console

# 验证服务访问
curl -kI https://$(oc get route console -n openshift-console -o jsonpath='{.spec.host}')

# 检查Operator日志
oc logs -n openshift-console deployment/console-operator

3. 配置管理

3.1 身份认证集成

认证方式 配置文件位置 关键参数
OAuth/OIDC oauth.config.openshift.io issuerURL, clientSecret
HTPasswd htpasswd Secret username, password
LDAP ldap ConfigMap url, bindDN, bindPassword

3.2 自定义主题

  1. 创建ConfigMap包含自定义资源:
1
2
3
4
5
oc create configmap custom-branding \
--from-file=logo=logo.svg \
--from-file=favicon.ico=favicon.ico \
--from-file=stylesheet.css=styles.css \
-n openshift-console
  1. 更新Console CRD:
1
2
3
4
5
6
7
8
spec:
customization:
customLogoFile:
key: logo
name: custom-branding
customStylesheet:
key: stylesheet.css
name: custom-branding

3.3 插件扩展

1
2
3
4
5
6
7
8
9
10
apiVersion: console.openshift.io/v1
kind: ConsolePlugin
metadata:
name: custom-plugin
spec:
displayName: "监控仪表板"
service:
name: console-plugin
port: 9443
basePath: /

4. 日常运维

4.1 监控与告警

关键监控指标:

  • console_http_requests_total:HTTP请求量
  • console_http_request_duration_seconds:响应延迟
  • container_memory_usage_bytes:容器内存使用
  • kube_pod_status_ready:Pod就绪状态

核心告警规则:

1
2
3
4
5
6
7
8
- alert: ConsoleHighLatency
expr: histogram_quantile(0.95, rate(console_http_request_duration_seconds_bucket[5m])) > 2
for: 5m
labels:
severity: warning
annotations:
summary: "控制台高延迟"
description: "控制台95%请求延迟超过2秒"

4.2 日志管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看实时日志
oc logs -f deployment/console -n openshift-console

# 日志级别调整(临时)
oc set env deployment/console -n openshift-console LOG_LEVEL=debug

# 持久化日志配置(EFK Stack)
apiVersion: logging.openshift.io/v1
kind: ClusterLogging
spec:
managementState: Managed
collection:
logs:
type: vector
visualization:
type: kibana

4.3 备份与恢复

备份清单:

  1. Console自定义配置:
1
oc get console cluster -o yaml > console-backup.yaml
  1. OAuth配置:
1
oc get oauth.config.openshift.io cluster -o yaml > oauth-backup.yaml
  1. 自定义资源ConfigMap:
1
oc get configmap custom-branding -n openshift-console -o yaml > branding-backup.yaml

恢复流程:

1
2
3
oc apply -f console-backup.yaml
oc apply -f oauth-backup.yaml
oc apply -f branding-backup.yaml

5. 故障排查指南

5.1 常见问题及解决方案

故障现象 排查命令 解决方案
控制台无法访问 oc get route -n openshift-console
curl -vk https://console-url
检查路由、证书和网络策略
身份认证失败 oc get pods -n openshift-authentication
oc logs oauth-openshift-xxx
验证OAuth配置和身份提供者状态
控制台响应缓慢 oc adm top pods -n openshift-console
oc get events --sort-by='.lastTimestamp'
扩展副本数或调整资源限制
自定义主题未生效 oc describe console cluster
oc get configmap custom-branding
检查ConfigMap挂载和权限

5.2 调试工具

1
2
3
4
5
6
7
8
# 检查API服务状态
oc get apiservices | grep console

# 诊断Operator健康状况
oc describe clusteroperators console

# 浏览器端调试
# 访问 https://console-url/dashboards 查看性能指标

6. 最佳实践

6.1 安全加固

  1. 启用TLS 1.3
1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: config.openshift.io/v1
kind: Ingress
metadata:
name: cluster
spec:
tlsSecurityProfile:
type: Custom
custom:
ciphers:
- TLS_AES_128_GCM_SHA256
- TLS_AES_256_GCM_SHA384
minTLSVersion: VersionTLS13
  1. RBAC最小权限原则
1
2
3
4
5
oc create clusterrole console-viewer \
--verb=get,list,watch \
--resource=pods,deployments,services

oc adm policy add-cluster-role-to-group console-viewer developers

6.2 高可用配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: apps/v1
kind: Deployment
metadata:
name: console
namespace: openshift-console
spec:
replicas: 3 # 根据集群规模调整
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- console
topologyKey: "kubernetes.io/hostname"

6.3 性能优化

  • 资源限额
    1
    2
    3
    4
    5
    6
    7
    resources:
    requests:
    memory: "512Mi"
    cpu: "200m"
    limits:
    memory: "1Gi"
    cpu: "500m"
  • 浏览器缓存优化
    1
    2
    3
    4
    5
    location / {
    add_header Cache-Control "public, max-age=3600";
    gzip on;
    gzip_types text/plain application/javascript application/x-javascript text/css;
    }

7. 升级策略

1
2
3
4
5
6
7
8
9
10
11
12
graph LR
A[准备阶段] --> B[备份关键配置]
B --> C[验证升级路径]
C --> D[升级Operator]
D --> E[滚动更新控制台]
E --> F[验收测试]
F --> G[监控稳定性]

subgraph 回滚计划
H[检查备份] --> I[还原Console CR]
I --> J[回滚Operator版本]
end

关键检查点:

  1. 检查Operator订阅通道:oc get subscription console-operator -n openshift-console
  2. 验证兼容性矩阵:确保控制台版本与集群版本匹配
  3. 灰度升级策略:先升级非生产环境集群

8. 总结

OpenShift Web控制台运维核心要点:

  • 自动化优先:通过Operator管理生命周期
  • 配置即代码:所有自定义通过CRD管理
  • 可观测性:建立完善的监控和日志体系
  • 安全纵深防御:网络隔离、RBAC、证书管理
  • 灾备能力:定期备份关键配置,制定回滚方案

经验提示:生产环境每次变更前必须验证配置语法:oc apply --dry-run=server -f console-config.yaml

001-JavaScript 数据类型

JavaScript 数据类型

两大分类

  1. 基本类型(Primitive Types)
  • string:字符串
  • number:数字
  • boolean:布尔值
  • null:空值
  • undefined:未定义
  • symbol(ES6新增):符号,表示唯一值
  • bigint(ES2020新增):大整数,表示任意大的整数
  1. 引用类型(Reference Types)
  • Object:对象
  • 包括:Array, Function, Date, RegExp, Map, Set, WeakMap, WeakSet等。

基本类型 vs 引用类型的核心区别

特性 基本类型 引用类型
存储方式 栈内存(直接存储值) 堆内存(存储地址,栈中存指针)
赋值行为 复制值(新旧变量互不影响) 复制指针(指向同一内存对象)
比较方式 值比较('a' === 'a'true 引用比较({} === {}false
函数传参 传递值的副本 传递指针副本(内部修改影响外部对象)
动态属性 不可添加属性 可动态添加/删除属性
内存管理 变量销毁时自动回收 需垃圾回收机制处理

复习一下数据结构:
1.栈(Stack)
逻辑结构:一种线性结构,遵循后进先出(LIFO)原则,仅允许在表的一端(栈顶)进行插入(push)和删除(pop)操作。
物理实现:通常通过数组或链表实现,数据连续存储,操作仅涉及栈顶元素。
典型操作:
push:将元素压入栈顶。
pop:弹出栈顶元素。
peek:查看栈顶元素(不弹出)。
2.堆(Heap)
逻辑结构:一种树形结构,通常为完全二叉树,满足堆性质(父节点的值大于或等于子节点的值称为最大堆,反之为最小堆)。
物理实现:通过数组实现,逻辑上模拟树结构,物理上连续存储。
典型操作:
insert:插入元素并保持堆性质。
extract:移除根节点(最大或最小值)。
heapify:调整节点位置以维护堆性质。

示例说明

1
2
3
4
5
6
7
8
9
10
11
// 基本类型 - 值复制
let num1 = 10;
let num2 = num1; // 值复制
num2 = 20;
console.log(num1); // 10(不受影响)

// 引用类型 - 指针复制
let obj1 = { count: 10 };
let obj2 = obj1; // 指针复制
obj2.count = 20;
console.log(obj1.count); // 20(同步修改)

Symbol 详解

作用:创建唯一的、不可变的值,常用作对象属性的键(避免命名冲突)。
特性

  • 通过 Symbol([description]) 创建
  • 即使描述相同,Symbol 值也不同:Symbol('id') !== Symbol('id')
  • 不可枚举(for...in 跳过),需用 Object.getOwnPropertySymbols() 获取
    1
    2
    3
    const sym1 = Symbol('id');
    const sym2 = Symbol('id');
    console.log(sym1 === sym2); // false(唯一性)

应用场景:

  1. 唯一对象属性键
    避免第三方库属性名冲突:

    1
    2
    3
    4
    const user = {
    name: "Alice",
    [Symbol('id')]: 123 // 隐藏属性
    };
  2. 模拟私有属性
    (需配合 Object.defineProperty 或闭包实现真正私有):

    1
    2
    3
    4
    5
    6
    const _password = Symbol('password');
    class User {
    constructor(password) {
    this[_password] = password;
    }
    }
  3. 全局 Symbol 注册表
    跨模块共享 Symbol:

    1
    2
    3
    4
    5
    // module1.js
    const id = Symbol.for('global_id');
    // module2.js
    const sameId = Symbol.for('global_id');
    console.log(id === sameId); // true
  4. 内置 Symbol 值
    定制对象行为(如迭代器):

    1
    2
    3
    4
    5
    6
    7
    const obj = {
    [Symbol.iterator]: function* () {
    yield 1;
    yield 2;
    }
    };
    console.log([...obj]); // [1, 2]

应用场景

场景 说明 示例
唯一对象属性键 由于Symbol值是唯一的,因此可以用来作为对象属性的键,避免属性名冲突 const obj = { [Symbol('id')]: 123 };
模拟私有属性 配合闭包实现伪私有属性(虽然ES6的类并没有真正的私有属性,但使用Symbol可以在一定程度上模拟私有属性,因为外部无法直接访问Symbol属性) const _key = Symbol(); class Safe { constructor(k) { this[_key] = k; } }
全局Symbol注册表 跨模块/文件共享Symbol //module1.js Symbol.for('global'); //module2.js Symbol.for('global');
内置Symbol行为定制 实现迭代协议等特殊行为(ES6提供了一些内置的Symbol值,用于改变语言内部行为,如Symbol.iterator(定义迭代器)、Symbol.toStringTag const iterable = { [Symbol.iterator]: function*() { yield 1; } };
定义常量 用于定义一组常量,保证这组常量的值都是不相等的。 const LOG_LEVEL = {DEBUG: Symbol('debug'),INFO: Symbol('info'),ERROR: Symbol('error')};

BigInt 详解

特性

作用:表示任意精度的整数,解决 Number 类型无法安全表示的大整数问题(Number.MAX_SAFE_INTEGER = 2^53 - 1)。
特性

  • 字面量加 n 后缀:12345678901234567890n
  • 通过 BigInt() 函数转换:BigInt("9007199254740993")
  • 不能与 Number 直接运算(需显式转换)

应用场景:

  1. 大整数运算
    金融、科学计算等需要高精度的场景:

    1
    2
    3
    const big1 = 9007199254740993n;
    const big2 = 1n;
    console.log(big1 + big2); // 9007199254740994n
  2. 大 ID 处理
    数据库返回的 64 位 ID(如 Snowflake 算法生成的 ID):

    1
    const id = BigInt("12345678901234567890"); // 超出 Number 安全范围
  3. 高精度时间戳
    纳秒级时间戳运算:

    1
    2
    3
    4
    const start = process.hrtime.bigint(); // Node.js
    // 执行操作...
    const end = process.hrtime.bigint();
    console.log(`耗时: ${(end - start) / 1000000n} 毫秒`);
  4. 大数加密/哈希
    密码学中的大整数运算:

    1
    const prime = BigInt("0xFFFFFFFFFFFFFFFFC90FDAA...");

注意事项:

  • 不支持 Math 对象的方法
  • 与 Number 比较时类型不同(1n === 1 → false
  • JSON 序列化需自定义处理(默认抛出错误)
1
2
3
4
5
6
// 类型转换
console.log(1n == 1); // true(值相等)
console.log(1n === 1); // false(类型不同)

// 运算限制
console.log(Math.sqrt(16n)); // TypeError(不支持Math方法)

总结对比

类型 核心特性 典型应用场景
Symbol 唯一性、不可枚举、避免冲突 对象元编程、私有属性模拟、库开发
BigInt 任意精度、突破Number安全限制 大整数ID、金融计算、高精度时间处理