Skip to content

Allow creating unique pod and hostname for KubernetesPodOperator from task job_id - #32278

Closed
juhai wants to merge 1 commit into
apache:mainfrom
juhai:pod-name-suffix-with-job-id
Closed

Allow creating unique pod and hostname for KubernetesPodOperator from task job_id#32278
juhai wants to merge 1 commit into
apache:mainfrom
juhai:pod-name-suffix-with-job-id

Conversation

@juhai

@juhaijuhai commented Jun 30, 2023

Copy link
Copy Markdown

This PR provides support for creating unique but sensible names to k8s pods based on the given name and ti.job_id. The KubernetesPodOperator supports adding random suffix but that isn't suitable for our use case. The random suffix can't be templated and isn't available via DAG context.

The background for this is the need to run Spark tasks in k8s. In order to use the preferred client mode, the pod name needs to be placed in spark configuration so that driver-executor communication can take place via a headless k8s service. This requires that the name of the (driver) pod is unique and known at the time the pod is created. The ti.job_id seems to be a good way to make pod names unique and is available via pod context when pod is created.

The change adds a new argument job_id_as_suffix to the KubernetesPodOperator class with backwards compatibility with random_suffix. In case job_id_as_suffix=True and random_name_suffix=False, the ti.job_id value from context will be appended to the pod name, separated by -. The same value can then be provided to spark configuration via Airflow templating to use as the driver hostname for the headless service.

@boring-cyborgboring-cyborgBot added provider:cncf-kubernetes Kubernetes (k8s) provider related issues area:providers labels Jun 30, 2023
Comment on lines 161 to 162

@eladkaleladkalJun 30, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will be very confusing.
If we want this need we need to do something similar to #30718
which means deprecate random_name_suffix and add name_suffix with options of (None, "random", "job_id")

On a more high level note I don't think this will work as you expect?
as noted in random_name_suffix the chars allowed are [a-z0-9.-] so what will happen when task_id contains illegal chars? I suspect that your goal is to match the task_id of airflow to the pod name for easier find but when it's not exact match and you start playing around with modifying the names then it defeat the purpose

WDYT?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, I agree with your proposal to change the suffixing logic instead. I don't know how the deprecation process would work for this, though.

This is using ti.job_id which I think is assigned by airflow, task_id is separate and can be supplied in KubernetesPodOperator. We shouldn't use that for the reason you state. I have not seen a way to modify the job_id.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added another proposal which makes the following changes

  • Use name_suffix instead of two arguments to control the suffix operation as suggested
  • Make hostname suffix modification optional via add_suffix_to_hostname. I am not aware of situations where hostname could/should be different from pod name but the random suffix has not been applied to hostname before.
  • Change default of random_suffix to False and notify about deprecation if it's set to True.
  • Clean _create_pod_id as some options were never given. Set the full pod name with suffix inside to take account both random and job_id based suffix.

@eladkaleladkalJul 17, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consulted with @jedcunningham also on this one.

Can you clarify why pod_mutation_hook and/or adding the name parameter to templated_field is insufficient ?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you both for the feedback and the suggestions. I think the pod_mutation_field could work but need to make sure the pod name stays within the length limit. The templated_field option sounds fine too but requires a change in the op to skip the name validity checking in the constructor. Do you think this is worth pursuing, I could prepare a PR for that?

I found pre_execute to be most suitable for my purposes after all. Since the context of the job to be launched is available I can override the name before execute is called. I will close the PR for now.

@juhai
juhaiforce-pushed the pod-name-suffix-with-job-id branch from 404260d to ef0e278CompareJuly 4, 2023 13:17
@juhai
juhaiforce-pushed the pod-name-suffix-with-job-id branch from ef0e278 to 5c1124aCompareJuly 4, 2023 14:51
@juhai

Copy link
Copy Markdown
Author

Closing as the current proposal isn't required to achieve what I need

@juhaijuhai closed this Jul 17, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:providersprovider:cncf-kubernetesKubernetes (k8s) provider related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@juhai@eladkal
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Allow creating unique pod and hostname for KubernetesPodOperator from task job_id by juhai · Pull Request #32278 · apache/airflow · GitHub
Skip to content

Allow creating unique pod and hostname for KubernetesPodOperator from task job_id - #32278

Closed
juhai wants to merge 1 commit into
apache:mainfrom
juhai:pod-name-suffix-with-job-id
Closed

Allow creating unique pod and hostname for KubernetesPodOperator from task job_id#32278
juhai wants to merge 1 commit into
apache:mainfrom
juhai:pod-name-suffix-with-job-id

Conversation

@juhai

@juhaijuhai commented Jun 30, 2023

Copy link
Copy Markdown

This PR provides support for creating unique but sensible names to k8s pods based on the given name and ti.job_id. The KubernetesPodOperator supports adding random suffix but that isn't suitable for our use case. The random suffix can't be templated and isn't available via DAG context.

The background for this is the need to run Spark tasks in k8s. In order to use the preferred client mode, the pod name needs to be placed in spark configuration so that driver-executor communication can take place via a headless k8s service. This requires that the name of the (driver) pod is unique and known at the time the pod is created. The ti.job_id seems to be a good way to make pod names unique and is available via pod context when pod is created.

The change adds a new argument job_id_as_suffix to the KubernetesPodOperator class with backwards compatibility with random_suffix. In case job_id_as_suffix=True and random_name_suffix=False, the ti.job_id value from context will be appended to the pod name, separated by -. The same value can then be provided to spark configuration via Airflow templating to use as the driver hostname for the headless service.

@boring-cyborgboring-cyborgBot added provider:cncf-kubernetes Kubernetes (k8s) provider related issues area:providers labels Jun 30, 2023
Comment on lines 161 to 162

@eladkaleladkalJun 30, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will be very confusing.
If we want this need we need to do something similar to #30718
which means deprecate random_name_suffix and add name_suffix with options of (None, "random", "job_id")

On a more high level note I don't think this will work as you expect?
as noted in random_name_suffix the chars allowed are [a-z0-9.-] so what will happen when task_id contains illegal chars? I suspect that your goal is to match the task_id of airflow to the pod name for easier find but when it's not exact match and you start playing around with modifying the names then it defeat the purpose

WDYT?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, I agree with your proposal to change the suffixing logic instead. I don't know how the deprecation process would work for this, though.

This is using ti.job_id which I think is assigned by airflow, task_id is separate and can be supplied in KubernetesPodOperator. We shouldn't use that for the reason you state. I have not seen a way to modify the job_id.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added another proposal which makes the following changes

  • Use name_suffix instead of two arguments to control the suffix operation as suggested
  • Make hostname suffix modification optional via add_suffix_to_hostname. I am not aware of situations where hostname could/should be different from pod name but the random suffix has not been applied to hostname before.
  • Change default of random_suffix to False and notify about deprecation if it's set to True.
  • Clean _create_pod_id as some options were never given. Set the full pod name with suffix inside to take account both random and job_id based suffix.

@eladkaleladkalJul 17, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consulted with @jedcunningham also on this one.

Can you clarify why pod_mutation_hook and/or adding the name parameter to templated_field is insufficient ?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you both for the feedback and the suggestions. I think the pod_mutation_field could work but need to make sure the pod name stays within the length limit. The templated_field option sounds fine too but requires a change in the op to skip the name validity checking in the constructor. Do you think this is worth pursuing, I could prepare a PR for that?

I found pre_execute to be most suitable for my purposes after all. Since the context of the job to be launched is available I can override the name before execute is called. I will close the PR for now.

@juhai
juhaiforce-pushed the pod-name-suffix-with-job-id branch from 404260d to ef0e278CompareJuly 4, 2023 13:17
@juhai
juhaiforce-pushed the pod-name-suffix-with-job-id branch from ef0e278 to 5c1124aCompareJuly 4, 2023 14:51
@juhai

Copy link
Copy Markdown
Author

Closing as the current proposal isn't required to achieve what I need

@juhaijuhai closed this Jul 17, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:providersprovider:cncf-kubernetesKubernetes (k8s) provider related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@juhai@eladkal
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Allow creating unique pod and hostname for KubernetesPodOperator from task job_id by juhai · Pull Request #32278 · apache/airflow · GitHub
Skip to content

Allow creating unique pod and hostname for KubernetesPodOperator from task job_id - #32278

Closed
juhai wants to merge 1 commit into
apache:mainfrom
juhai:pod-name-suffix-with-job-id
Closed

Allow creating unique pod and hostname for KubernetesPodOperator from task job_id#32278
juhai wants to merge 1 commit into
apache:mainfrom
juhai:pod-name-suffix-with-job-id

Conversation

@juhai

@juhaijuhai commented Jun 30, 2023

Copy link
Copy Markdown

This PR provides support for creating unique but sensible names to k8s pods based on the given name and ti.job_id. The KubernetesPodOperator supports adding random suffix but that isn't suitable for our use case. The random suffix can't be templated and isn't available via DAG context.

The background for this is the need to run Spark tasks in k8s. In order to use the preferred client mode, the pod name needs to be placed in spark configuration so that driver-executor communication can take place via a headless k8s service. This requires that the name of the (driver) pod is unique and known at the time the pod is created. The ti.job_id seems to be a good way to make pod names unique and is available via pod context when pod is created.

The change adds a new argument job_id_as_suffix to the KubernetesPodOperator class with backwards compatibility with random_suffix. In case job_id_as_suffix=True and random_name_suffix=False, the ti.job_id value from context will be appended to the pod name, separated by -. The same value can then be provided to spark configuration via Airflow templating to use as the driver hostname for the headless service.

@boring-cyborgboring-cyborgBot added provider:cncf-kubernetes Kubernetes (k8s) provider related issues area:providers labels Jun 30, 2023
Comment on lines 161 to 162

@eladkaleladkalJun 30, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will be very confusing.
If we want this need we need to do something similar to #30718
which means deprecate random_name_suffix and add name_suffix with options of (None, "random", "job_id")

On a more high level note I don't think this will work as you expect?
as noted in random_name_suffix the chars allowed are [a-z0-9.-] so what will happen when task_id contains illegal chars? I suspect that your goal is to match the task_id of airflow to the pod name for easier find but when it's not exact match and you start playing around with modifying the names then it defeat the purpose

WDYT?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, I agree with your proposal to change the suffixing logic instead. I don't know how the deprecation process would work for this, though.

This is using ti.job_id which I think is assigned by airflow, task_id is separate and can be supplied in KubernetesPodOperator. We shouldn't use that for the reason you state. I have not seen a way to modify the job_id.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added another proposal which makes the following changes

  • Use name_suffix instead of two arguments to control the suffix operation as suggested
  • Make hostname suffix modification optional via add_suffix_to_hostname. I am not aware of situations where hostname could/should be different from pod name but the random suffix has not been applied to hostname before.
  • Change default of random_suffix to False and notify about deprecation if it's set to True.
  • Clean _create_pod_id as some options were never given. Set the full pod name with suffix inside to take account both random and job_id based suffix.

@eladkaleladkalJul 17, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consulted with @jedcunningham also on this one.

Can you clarify why pod_mutation_hook and/or adding the name parameter to templated_field is insufficient ?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you both for the feedback and the suggestions. I think the pod_mutation_field could work but need to make sure the pod name stays within the length limit. The templated_field option sounds fine too but requires a change in the op to skip the name validity checking in the constructor. Do you think this is worth pursuing, I could prepare a PR for that?

I found pre_execute to be most suitable for my purposes after all. Since the context of the job to be launched is available I can override the name before execute is called. I will close the PR for now.

@juhai
juhaiforce-pushed the pod-name-suffix-with-job-id branch from 404260d to ef0e278CompareJuly 4, 2023 13:17
@juhai
juhaiforce-pushed the pod-name-suffix-with-job-id branch from ef0e278 to 5c1124aCompareJuly 4, 2023 14:51
@juhai

Copy link
Copy Markdown
Author

Closing as the current proposal isn't required to achieve what I need

@juhaijuhai closed this Jul 17, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:providersprovider:cncf-kubernetesKubernetes (k8s) provider related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@juhai@eladkal
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Allow creating unique pod and hostname for KubernetesPodOperator from task job_id by juhai · Pull Request #32278 · apache/airflow · GitHub
Skip to content

Allow creating unique pod and hostname for KubernetesPodOperator from task job_id - #32278

Closed
juhai wants to merge 1 commit into
apache:mainfrom
juhai:pod-name-suffix-with-job-id
Closed

Allow creating unique pod and hostname for KubernetesPodOperator from task job_id#32278
juhai wants to merge 1 commit into
apache:mainfrom
juhai:pod-name-suffix-with-job-id

Conversation

@juhai

@juhaijuhai commented Jun 30, 2023

Copy link
Copy Markdown

This PR provides support for creating unique but sensible names to k8s pods based on the given name and ti.job_id. The KubernetesPodOperator supports adding random suffix but that isn't suitable for our use case. The random suffix can't be templated and isn't available via DAG context.

The background for this is the need to run Spark tasks in k8s. In order to use the preferred client mode, the pod name needs to be placed in spark configuration so that driver-executor communication can take place via a headless k8s service. This requires that the name of the (driver) pod is unique and known at the time the pod is created. The ti.job_id seems to be a good way to make pod names unique and is available via pod context when pod is created.

The change adds a new argument job_id_as_suffix to the KubernetesPodOperator class with backwards compatibility with random_suffix. In case job_id_as_suffix=True and random_name_suffix=False, the ti.job_id value from context will be appended to the pod name, separated by -. The same value can then be provided to spark configuration via Airflow templating to use as the driver hostname for the headless service.

@boring-cyborgboring-cyborgBot added provider:cncf-kubernetes Kubernetes (k8s) provider related issues area:providers labels Jun 30, 2023
Comment on lines 161 to 162

@eladkaleladkalJun 30, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will be very confusing.
If we want this need we need to do something similar to #30718
which means deprecate random_name_suffix and add name_suffix with options of (None, "random", "job_id")

On a more high level note I don't think this will work as you expect?
as noted in random_name_suffix the chars allowed are [a-z0-9.-] so what will happen when task_id contains illegal chars? I suspect that your goal is to match the task_id of airflow to the pod name for easier find but when it's not exact match and you start playing around with modifying the names then it defeat the purpose

WDYT?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, I agree with your proposal to change the suffixing logic instead. I don't know how the deprecation process would work for this, though.

This is using ti.job_id which I think is assigned by airflow, task_id is separate and can be supplied in KubernetesPodOperator. We shouldn't use that for the reason you state. I have not seen a way to modify the job_id.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added another proposal which makes the following changes

  • Use name_suffix instead of two arguments to control the suffix operation as suggested
  • Make hostname suffix modification optional via add_suffix_to_hostname. I am not aware of situations where hostname could/should be different from pod name but the random suffix has not been applied to hostname before.
  • Change default of random_suffix to False and notify about deprecation if it's set to True.
  • Clean _create_pod_id as some options were never given. Set the full pod name with suffix inside to take account both random and job_id based suffix.

@eladkaleladkalJul 17, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consulted with @jedcunningham also on this one.

Can you clarify why pod_mutation_hook and/or adding the name parameter to templated_field is insufficient ?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you both for the feedback and the suggestions. I think the pod_mutation_field could work but need to make sure the pod name stays within the length limit. The templated_field option sounds fine too but requires a change in the op to skip the name validity checking in the constructor. Do you think this is worth pursuing, I could prepare a PR for that?

I found pre_execute to be most suitable for my purposes after all. Since the context of the job to be launched is available I can override the name before execute is called. I will close the PR for now.

@juhai
juhaiforce-pushed the pod-name-suffix-with-job-id branch from 404260d to ef0e278CompareJuly 4, 2023 13:17
@juhai
juhaiforce-pushed the pod-name-suffix-with-job-id branch from ef0e278 to 5c1124aCompareJuly 4, 2023 14:51
@juhai

Copy link
Copy Markdown
Author

Closing as the current proposal isn't required to achieve what I need

@juhaijuhai closed this Jul 17, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:providersprovider:cncf-kubernetesKubernetes (k8s) provider related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@juhai@eladkal
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Allow creating unique pod and hostname for KubernetesPodOperator from task job_id by juhai · Pull Request #32278 · apache/airflow · GitHub
Skip to content

Allow creating unique pod and hostname for KubernetesPodOperator from task job_id - #32278

Closed
juhai wants to merge 1 commit into
apache:mainfrom
juhai:pod-name-suffix-with-job-id
Closed

Allow creating unique pod and hostname for KubernetesPodOperator from task job_id#32278
juhai wants to merge 1 commit into
apache:mainfrom
juhai:pod-name-suffix-with-job-id

Conversation

@juhai

@juhaijuhai commented Jun 30, 2023

Copy link
Copy Markdown

This PR provides support for creating unique but sensible names to k8s pods based on the given name and ti.job_id. The KubernetesPodOperator supports adding random suffix but that isn't suitable for our use case. The random suffix can't be templated and isn't available via DAG context.

The background for this is the need to run Spark tasks in k8s. In order to use the preferred client mode, the pod name needs to be placed in spark configuration so that driver-executor communication can take place via a headless k8s service. This requires that the name of the (driver) pod is unique and known at the time the pod is created. The ti.job_id seems to be a good way to make pod names unique and is available via pod context when pod is created.

The change adds a new argument job_id_as_suffix to the KubernetesPodOperator class with backwards compatibility with random_suffix. In case job_id_as_suffix=True and random_name_suffix=False, the ti.job_id value from context will be appended to the pod name, separated by -. The same value can then be provided to spark configuration via Airflow templating to use as the driver hostname for the headless service.

@boring-cyborgboring-cyborgBot added provider:cncf-kubernetes Kubernetes (k8s) provider related issues area:providers labels Jun 30, 2023
Comment on lines 161 to 162

@eladkaleladkalJun 30, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will be very confusing.
If we want this need we need to do something similar to #30718
which means deprecate random_name_suffix and add name_suffix with options of (None, "random", "job_id")

On a more high level note I don't think this will work as you expect?
as noted in random_name_suffix the chars allowed are [a-z0-9.-] so what will happen when task_id contains illegal chars? I suspect that your goal is to match the task_id of airflow to the pod name for easier find but when it's not exact match and you start playing around with modifying the names then it defeat the purpose

WDYT?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, I agree with your proposal to change the suffixing logic instead. I don't know how the deprecation process would work for this, though.

This is using ti.job_id which I think is assigned by airflow, task_id is separate and can be supplied in KubernetesPodOperator. We shouldn't use that for the reason you state. I have not seen a way to modify the job_id.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added another proposal which makes the following changes

  • Use name_suffix instead of two arguments to control the suffix operation as suggested
  • Make hostname suffix modification optional via add_suffix_to_hostname. I am not aware of situations where hostname could/should be different from pod name but the random suffix has not been applied to hostname before.
  • Change default of random_suffix to False and notify about deprecation if it's set to True.
  • Clean _create_pod_id as some options were never given. Set the full pod name with suffix inside to take account both random and job_id based suffix.

@eladkaleladkalJul 17, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consulted with @jedcunningham also on this one.

Can you clarify why pod_mutation_hook and/or adding the name parameter to templated_field is insufficient ?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you both for the feedback and the suggestions. I think the pod_mutation_field could work but need to make sure the pod name stays within the length limit. The templated_field option sounds fine too but requires a change in the op to skip the name validity checking in the constructor. Do you think this is worth pursuing, I could prepare a PR for that?

I found pre_execute to be most suitable for my purposes after all. Since the context of the job to be launched is available I can override the name before execute is called. I will close the PR for now.

@juhai
juhaiforce-pushed the pod-name-suffix-with-job-id branch from 404260d to ef0e278CompareJuly 4, 2023 13:17
@juhai
juhaiforce-pushed the pod-name-suffix-with-job-id branch from ef0e278 to 5c1124aCompareJuly 4, 2023 14:51
@juhai

Copy link
Copy Markdown
Author

Closing as the current proposal isn't required to achieve what I need

@juhaijuhai closed this Jul 17, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:providersprovider:cncf-kubernetesKubernetes (k8s) provider related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@juhai@eladkal
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Allow creating unique pod and hostname for KubernetesPodOperator from task job_id by juhai · Pull Request #32278 · apache/airflow · GitHub
Skip to content

Allow creating unique pod and hostname for KubernetesPodOperator from task job_id - #32278

Closed
juhai wants to merge 1 commit into
apache:mainfrom
juhai:pod-name-suffix-with-job-id
Closed

Allow creating unique pod and hostname for KubernetesPodOperator from task job_id#32278
juhai wants to merge 1 commit into
apache:mainfrom
juhai:pod-name-suffix-with-job-id

Conversation

@juhai

@juhaijuhai commented Jun 30, 2023

Copy link
Copy Markdown

This PR provides support for creating unique but sensible names to k8s pods based on the given name and ti.job_id. The KubernetesPodOperator supports adding random suffix but that isn't suitable for our use case. The random suffix can't be templated and isn't available via DAG context.

The background for this is the need to run Spark tasks in k8s. In order to use the preferred client mode, the pod name needs to be placed in spark configuration so that driver-executor communication can take place via a headless k8s service. This requires that the name of the (driver) pod is unique and known at the time the pod is created. The ti.job_id seems to be a good way to make pod names unique and is available via pod context when pod is created.

The change adds a new argument job_id_as_suffix to the KubernetesPodOperator class with backwards compatibility with random_suffix. In case job_id_as_suffix=True and random_name_suffix=False, the ti.job_id value from context will be appended to the pod name, separated by -. The same value can then be provided to spark configuration via Airflow templating to use as the driver hostname for the headless service.

@boring-cyborgboring-cyborgBot added provider:cncf-kubernetes Kubernetes (k8s) provider related issues area:providers labels Jun 30, 2023
Comment on lines 161 to 162

@eladkaleladkalJun 30, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will be very confusing.
If we want this need we need to do something similar to #30718
which means deprecate random_name_suffix and add name_suffix with options of (None, "random", "job_id")

On a more high level note I don't think this will work as you expect?
as noted in random_name_suffix the chars allowed are [a-z0-9.-] so what will happen when task_id contains illegal chars? I suspect that your goal is to match the task_id of airflow to the pod name for easier find but when it's not exact match and you start playing around with modifying the names then it defeat the purpose

WDYT?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, I agree with your proposal to change the suffixing logic instead. I don't know how the deprecation process would work for this, though.

This is using ti.job_id which I think is assigned by airflow, task_id is separate and can be supplied in KubernetesPodOperator. We shouldn't use that for the reason you state. I have not seen a way to modify the job_id.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added another proposal which makes the following changes

  • Use name_suffix instead of two arguments to control the suffix operation as suggested
  • Make hostname suffix modification optional via add_suffix_to_hostname. I am not aware of situations where hostname could/should be different from pod name but the random suffix has not been applied to hostname before.
  • Change default of random_suffix to False and notify about deprecation if it's set to True.
  • Clean _create_pod_id as some options were never given. Set the full pod name with suffix inside to take account both random and job_id based suffix.

@eladkaleladkalJul 17, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consulted with @jedcunningham also on this one.

Can you clarify why pod_mutation_hook and/or adding the name parameter to templated_field is insufficient ?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you both for the feedback and the suggestions. I think the pod_mutation_field could work but need to make sure the pod name stays within the length limit. The templated_field option sounds fine too but requires a change in the op to skip the name validity checking in the constructor. Do you think this is worth pursuing, I could prepare a PR for that?

I found pre_execute to be most suitable for my purposes after all. Since the context of the job to be launched is available I can override the name before execute is called. I will close the PR for now.

@juhai
juhaiforce-pushed the pod-name-suffix-with-job-id branch from 404260d to ef0e278CompareJuly 4, 2023 13:17
@juhai
juhaiforce-pushed the pod-name-suffix-with-job-id branch from ef0e278 to 5c1124aCompareJuly 4, 2023 14:51
@juhai

Copy link
Copy Markdown
Author

Closing as the current proposal isn't required to achieve what I need

@juhaijuhai closed this Jul 17, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:providersprovider:cncf-kubernetesKubernetes (k8s) provider related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@juhai@eladkal
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Allow creating unique pod and hostname for KubernetesPodOperator from task job_id by juhai · Pull Request #32278 · apache/airflow · GitHub
Skip to content

Allow creating unique pod and hostname for KubernetesPodOperator from task job_id - #32278

Closed
juhai wants to merge 1 commit into
apache:mainfrom
juhai:pod-name-suffix-with-job-id
Closed

Allow creating unique pod and hostname for KubernetesPodOperator from task job_id#32278
juhai wants to merge 1 commit into
apache:mainfrom
juhai:pod-name-suffix-with-job-id

Conversation

@juhai

@juhaijuhai commented Jun 30, 2023

Copy link
Copy Markdown

This PR provides support for creating unique but sensible names to k8s pods based on the given name and ti.job_id. The KubernetesPodOperator supports adding random suffix but that isn't suitable for our use case. The random suffix can't be templated and isn't available via DAG context.

The background for this is the need to run Spark tasks in k8s. In order to use the preferred client mode, the pod name needs to be placed in spark configuration so that driver-executor communication can take place via a headless k8s service. This requires that the name of the (driver) pod is unique and known at the time the pod is created. The ti.job_id seems to be a good way to make pod names unique and is available via pod context when pod is created.

The change adds a new argument job_id_as_suffix to the KubernetesPodOperator class with backwards compatibility with random_suffix. In case job_id_as_suffix=True and random_name_suffix=False, the ti.job_id value from context will be appended to the pod name, separated by -. The same value can then be provided to spark configuration via Airflow templating to use as the driver hostname for the headless service.

@boring-cyborgboring-cyborgBot added provider:cncf-kubernetes Kubernetes (k8s) provider related issues area:providers labels Jun 30, 2023
Comment on lines 161 to 162

@eladkaleladkalJun 30, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will be very confusing.
If we want this need we need to do something similar to #30718
which means deprecate random_name_suffix and add name_suffix with options of (None, "random", "job_id")

On a more high level note I don't think this will work as you expect?
as noted in random_name_suffix the chars allowed are [a-z0-9.-] so what will happen when task_id contains illegal chars? I suspect that your goal is to match the task_id of airflow to the pod name for easier find but when it's not exact match and you start playing around with modifying the names then it defeat the purpose

WDYT?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, I agree with your proposal to change the suffixing logic instead. I don't know how the deprecation process would work for this, though.

This is using ti.job_id which I think is assigned by airflow, task_id is separate and can be supplied in KubernetesPodOperator. We shouldn't use that for the reason you state. I have not seen a way to modify the job_id.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added another proposal which makes the following changes

  • Use name_suffix instead of two arguments to control the suffix operation as suggested
  • Make hostname suffix modification optional via add_suffix_to_hostname. I am not aware of situations where hostname could/should be different from pod name but the random suffix has not been applied to hostname before.
  • Change default of random_suffix to False and notify about deprecation if it's set to True.
  • Clean _create_pod_id as some options were never given. Set the full pod name with suffix inside to take account both random and job_id based suffix.

@eladkaleladkalJul 17, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consulted with @jedcunningham also on this one.

Can you clarify why pod_mutation_hook and/or adding the name parameter to templated_field is insufficient ?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you both for the feedback and the suggestions. I think the pod_mutation_field could work but need to make sure the pod name stays within the length limit. The templated_field option sounds fine too but requires a change in the op to skip the name validity checking in the constructor. Do you think this is worth pursuing, I could prepare a PR for that?

I found pre_execute to be most suitable for my purposes after all. Since the context of the job to be launched is available I can override the name before execute is called. I will close the PR for now.

@juhai
juhaiforce-pushed the pod-name-suffix-with-job-id branch from 404260d to ef0e278CompareJuly 4, 2023 13:17
@juhai
juhaiforce-pushed the pod-name-suffix-with-job-id branch from ef0e278 to 5c1124aCompareJuly 4, 2023 14:51
@juhai

Copy link
Copy Markdown
Author

Closing as the current proposal isn't required to achieve what I need

@juhaijuhai closed this Jul 17, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:providersprovider:cncf-kubernetesKubernetes (k8s) provider related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@juhai@eladkal
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Allow creating unique pod and hostname for KubernetesPodOperator from task job_id by juhai · Pull Request #32278 · apache/airflow · GitHub
Skip to content

Allow creating unique pod and hostname for KubernetesPodOperator from task job_id - #32278

Closed
juhai wants to merge 1 commit into
apache:mainfrom
juhai:pod-name-suffix-with-job-id
Closed

Allow creating unique pod and hostname for KubernetesPodOperator from task job_id#32278
juhai wants to merge 1 commit into
apache:mainfrom
juhai:pod-name-suffix-with-job-id

Conversation

@juhai

@juhaijuhai commented Jun 30, 2023

Copy link
Copy Markdown

This PR provides support for creating unique but sensible names to k8s pods based on the given name and ti.job_id. The KubernetesPodOperator supports adding random suffix but that isn't suitable for our use case. The random suffix can't be templated and isn't available via DAG context.

The background for this is the need to run Spark tasks in k8s. In order to use the preferred client mode, the pod name needs to be placed in spark configuration so that driver-executor communication can take place via a headless k8s service. This requires that the name of the (driver) pod is unique and known at the time the pod is created. The ti.job_id seems to be a good way to make pod names unique and is available via pod context when pod is created.

The change adds a new argument job_id_as_suffix to the KubernetesPodOperator class with backwards compatibility with random_suffix. In case job_id_as_suffix=True and random_name_suffix=False, the ti.job_id value from context will be appended to the pod name, separated by -. The same value can then be provided to spark configuration via Airflow templating to use as the driver hostname for the headless service.

@boring-cyborgboring-cyborgBot added provider:cncf-kubernetes Kubernetes (k8s) provider related issues area:providers labels Jun 30, 2023
Comment on lines 161 to 162

@eladkaleladkalJun 30, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will be very confusing.
If we want this need we need to do something similar to #30718
which means deprecate random_name_suffix and add name_suffix with options of (None, "random", "job_id")

On a more high level note I don't think this will work as you expect?
as noted in random_name_suffix the chars allowed are [a-z0-9.-] so what will happen when task_id contains illegal chars? I suspect that your goal is to match the task_id of airflow to the pod name for easier find but when it's not exact match and you start playing around with modifying the names then it defeat the purpose

WDYT?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, I agree with your proposal to change the suffixing logic instead. I don't know how the deprecation process would work for this, though.

This is using ti.job_id which I think is assigned by airflow, task_id is separate and can be supplied in KubernetesPodOperator. We shouldn't use that for the reason you state. I have not seen a way to modify the job_id.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added another proposal which makes the following changes

  • Use name_suffix instead of two arguments to control the suffix operation as suggested
  • Make hostname suffix modification optional via add_suffix_to_hostname. I am not aware of situations where hostname could/should be different from pod name but the random suffix has not been applied to hostname before.
  • Change default of random_suffix to False and notify about deprecation if it's set to True.
  • Clean _create_pod_id as some options were never given. Set the full pod name with suffix inside to take account both random and job_id based suffix.

@eladkaleladkalJul 17, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consulted with @jedcunningham also on this one.

Can you clarify why pod_mutation_hook and/or adding the name parameter to templated_field is insufficient ?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you both for the feedback and the suggestions. I think the pod_mutation_field could work but need to make sure the pod name stays within the length limit. The templated_field option sounds fine too but requires a change in the op to skip the name validity checking in the constructor. Do you think this is worth pursuing, I could prepare a PR for that?

I found pre_execute to be most suitable for my purposes after all. Since the context of the job to be launched is available I can override the name before execute is called. I will close the PR for now.

@juhai
juhaiforce-pushed the pod-name-suffix-with-job-id branch from 404260d to ef0e278CompareJuly 4, 2023 13:17
@juhai
juhaiforce-pushed the pod-name-suffix-with-job-id branch from ef0e278 to 5c1124aCompareJuly 4, 2023 14:51
@juhai

Copy link
Copy Markdown
Author

Closing as the current proposal isn't required to achieve what I need

@juhaijuhai closed this Jul 17, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:providersprovider:cncf-kubernetesKubernetes (k8s) provider related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@juhai@eladkal